1.文件目录
2.main.py主文件
- from utils import welcome,examineIdCard,playMusic,dataAnalysis
- import _thread
- theFirstTime = 1
- while True:
- _thread.start_new_thread(playMusic) #开启多线程播放音乐
- if theFirstTime == 1: #初次游玩(没有信息所以不展示数据分析功能)
- choose = int(input("请选择(1.进入 2.出去) :"))
- else:
- choose = int(input("请选择(1.进入 2.出去 3.数据分析) :"))
- if choose == 1:
- theFirstTime += 1
- welcome()
- examineIdCard()
- elif choose == 2:
- break #退出
- else:
- dataAnalysis() #进入数据分析
3.utils.py
简单说一下各个方法的功能:
welcome():输出一些信息
examineIdCard():对输入的身份证号(位数)进行判断、使用身份证校验位对身份证号进行有效校验
judgeMessage():对身份证信息省市区(目前只有山东省各市信息)、性别简单计算、年龄复杂计算(对我而言比较复杂~)
printMessage():将身份证获取到的信息保存在目录下的Identity Information.xlsx文件夹
playMusic():多线程播放音乐
body_height():输出信息、获取终端输入的身高信息
buyTicket():根据年龄和身高判断票的具体类型
dataAnalysis():读取Identity Information.xlsx文件里的内容,进行简单数据分析。
(时间紧迫,我就只对年龄和身高进行了饼图绘制)
- import numpy as np
- import pandas as pd
-
- def welcome():
- #欢迎语
- print("*************************欢~迎~游玩-->!青科大公园!*************************")
- print("----------------------------------------------------------------------------")
- print("| 购票须知 |")
- print("|(1)2岁以下(包含2岁)儿童免票。 |")
- print("|(2)2岁以上到16岁未成年人,未到1.2m的购买半票,超过1.2米(包含1.2米)的购全票。 |")
- print("|(3)16岁(不含16岁)到60岁(不含60岁)的成人购全票。 |")
- print("|(4)60岁及以上长者,凭退休证购买半票。 |")
- print("----------------------------------------------------------------------------")
-
- def examineIdCard():
- idCard = input("(售票老大爷)嗨!年轻人,公园售票口在这儿,快过来吧,把你的身份证(号码)给我:")
- #对身份证输入号码位数进行有效识别
- if len(idCard) != 18:
- print("您输入的身份证号位数错误,请重新输入!")
- else:
- #(准备)全部转化为列表容易操作
- idCard = list(idCard)
- WEIGHTS = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2] #设置加权因子列表
- sum = 0 #求和
- for i in range(len(WEIGHTS)):
- sum += int(idCard[i])*WEIGHTS[i]
- remainder = sum % 11 #计算余数
- REMAINDER_CHECKCODE = [1,0,'X',9,8,7,6,5,4,3,2] #设置余数-校验码对照表,采用列表形式
- if REMAINDER_CHECKCODE[remainder] == int(idCard[17]):
- print("(售票老大爷)oh~上帝啊 瞧一瞧,这个消息真让人开心,你的身份被上帝认可了~~")
- print("(售票老大爷)接下来请开始购票吧!")
- else:
- print("------------>身份证无效")
- #保存一些信息:前六位是地区代码,7~14位是出生年月,15、16为派出所代码,17位是性别
- sheng = "".join(idCard[0:2])#出生地
- shi = "".join(idCard[2:4])
- quxian = "".join(idCard[4:6])
- dateOfBirth = "".join(idCard[6:14]) #出生年月
- policeStation = "".join(idCard[14:16]) #派出所代码
- gender = "".join(idCard[16]) #性别
- sheng,shi,gender,age,nianBirth,yueBirth,riBirth = judgeMessage(idCard,sheng,shi,gender,dateOfBirth) #判断信息方法
- height = body_height() #输入身高信息函数
- # printMessage(idCard,sheng,shi,quxian,policeStation,gender,age,nianBirth,yueBirth,riBirth,height) ##打印信息方法
- printMessage(idCard,sheng,shi,quxian,dateOfBirth,policeStation,age,gender,height)
- buyTicket(age,height) #买票方法
-
- def judgeMessage(idCard,sheng,shi,gender,dateOfBirth):
- #信息判断
- if sheng == "37":
- sheng = "山东省"
- SHI = ['0','济南市','青岛市','淄博市','枣庄市','东营市','烟台市','潍坊市','济宁市','泰安市','威海市','日照市','','临沂市','德州市','聊城市','滨州市','菏泽市']
- shi = SHI[int(shi)]
- if gender == "1":
- gender = "男"
- else:
- gender="女"
- #处理年龄(粗略的计算年龄)
- # 计算机获取当前年月日 与 身份证上的年月日 进行做差比较
- import datetime
- nowDate = datetime.datetime.now().strftime('%Y%m%d')
- nianNowDate = nowDate[0:4] #20211223
- yueNowDate = nowDate[4:6]
- riNowDate = nowDate[6:8]
- idCard = "".join(idCard)
- nianBirth = idCard[6:10] #身份证上的年月日
- yueBirth = idCard[11:12]
- riBirth = idCard[12:14]
- if int(yueNowDate+riNowDate) < int(yueBirth+riBirth):
- #目前月日小于出生月日,说明今年生日还没有过
- age = int(nianNowDate)-int(nianBirth)
- else:
- #目前月日大于等于出生月日,说明今年生日已过,年龄还要再加1
- age = int(nianNowDate)-int(nianBirth)+1
- return sheng,shi,gender,age,nianBirth,yueBirth,riBirth
-
-
- def printMessage(idCard,sheng,shi,quxian,dateOfBirth,policeStation,age,gender,height):
- idCard = "".join(idCard)
- df = pd.read_excel('Identity Information.xlsx')
- #获取信息
- if gender == "男":
- idCard = "Adam"
- else:
- idCard = "Eve"
- sheng = sheng
- shi = shi
- quxian = quxian
- chushengdi = sheng+shi+quxian
- dateOfBirth = dateOfBirth
- policeStation = policeStation
- age = age
- gender = gender
- height = height
- #添加到表格中
- #1.获取当前表格的空行
- havehang_index = df.shape[0]
- df.loc[havehang_index] = [idCard,chushengdi,dateOfBirth,policeStation,age,gender,height]
- #重新保存
- df.to_excel("Identity Information.xlsx",encoding='utf-8',index=False)
-
- import winsound
- def playMusic():
- winsound.PlaySound("music/雪之梦重混版.wav",winsound.SND_FILENAME)
-
-
- def body_height():
- print("(售票老大爷)oh~上帝啊 瞧我的记性(公园售票处记忆力不好的老大爷),来!购票前上帝还需要你的一些信息")
- print("(售票老大爷)嗨!快过来! 你要到那里去儿")
- print("(售票老大爷)oh~上帝啊 快!告诉我你的身高吧,这样你就能够快点儿进去公园去和动物们打招呼了!")
- height = input("(售票老大爷)快点写上你的身高吧:")
- return height
-
- def buyTicket(age,height):
- if age<=2:
- #免票
- print("(售票老大爷)你才刚"+str(age)+"岁!免票")
- print("(售票老大爷)ohohoh~上帝真是眷顾你,我的孩子!快去玩儿吧")
- elif age>2 and age<=16:
- if height<120:
- print("(售票老大爷)你"+str(age)+"岁了,购买半票!")
- print("(售票老大爷)ohohoh~上帝真是眷顾你,你的票由程序开发人员帮你购买了!快去玩儿吧")
- else:
- print("(售票老大爷)你"+str(age)+"岁了,购买全票!")
- print("(售票老大爷)ohohoh~上帝真是眷顾你,你的票由程序开发人员帮你购买了!快去玩儿吧")
- elif age>16 and age<60:
- print("(售票老大爷)你"+str(age)+"了,已经成人喽!购买全票")
- print("(售票老大爷)ohohoh~上帝真是眷顾你,你的票由程序开发人员帮你购买了!快去玩儿吧")
- elif age>=60:
- get_txz = input("(售票老大爷)您带退休证了吗?(回答yes或者no!):")
- if get_txz == "yes":
- print("(售票老大爷)您购买半票!")
- if get_txz == "no":
- print("(售票老大爷)您购买全票!下次再来请记得带好您的退休证。")
-
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- def dataAnalysis():
- #简单数据分析(年龄、性别、身高),画个饼图
- #1.读取数据
- df = pd.read_excel('Identity Information.xlsx')
- #获取需要进行画图的列信息
- labels = list(df['姓名'])
- age = list(df['年龄'])
- gender = list(df['性别'])
- height = list(df['身高'])
- choice = input("请选择需要看的图:1(年龄比例饼图)、2(身高比例饼图)。请输入:")
- if choice == "1":
- #age
- plt.pie(x=age,labels=labels,autopct="%0.2f%%")
- plt.title("Age scale")
- else:
- #height
- plt.pie(x=height,labels=labels,autopct="%0.2f%%")
- plt.title("Height scale")
- # 显示图例
- plt.legend()
- # 展示
- plt.show()
4.使用方法。
(1)下载安装包,选择“解压到当前文件夹”
(2)使用vscode打开(使用你自己的python编辑器),进入main,py执行就可以了。
开始运行后,自动播放音乐(班得瑞的雪之梦重混版),会让你选择“进入”还是“退出”:
选择“进入”,弹出欢迎信息,然后输入你的身份证号:
(我就不输完了,保护隐私)
然后再出现一些交谈信息,提示你输入身高:
输入完身高后,会自动根据身份证获得的年龄结合身高,输出你的购票信息(这里往后我就没有再深入写了)我继续写数据分析去了
如上图,选择3进行数据分析
再继续选择图的种类(也是由于时间紧迫,我只做了两种图 年龄比例图和身高比例图),后续可以再往下写(我就此为止了!)
选择2,就得到图形了
源码百度云连接(没有VIP可能会比较慢):
链接:https://pan.baidu.com/s/1X2WaQ8Pmz8PouypTRJpS5w
提取码:rp9k
也可以加我的QQ:827843900 获取资料