from datetime import datetime
def judTorF(idNum): #判断身份证的真假
if len(idNum)!=18 : #如果长度不是十八,则说明输入的身份证不对
return False
elif checkCode(idNum) == False : #用函数checkCode,完成校验码的计算
return False
else :
return True
def checkCode(idNum) : #计算校验码的正确与否
idNum = list(idNum)
factor=(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
last=("1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2")
result = 0 #用result来保存每次累加的结果
for i in range(17) :
result += int(idNum[i])*factor[i]
if idNum[17] == last[result%11]: #如果输入的第十八位和计算出来的十八位相同则有效
return True
else :
return False
def province(num) : #从文件中找出省份
textFile = open("省份编号.txt","r", encoding='UTF-8') #打开文件,注意此时的.txt和.py放在同一个文件夹下
for line in textFile.readlines(): #遍历文件的每一行
if num in line: #如果这个身份证省或直辖市代码在在一行里面
result = str(line)[3:] #截取这个这一行除了数字之外的字符串,也就是对应省或直辖市的名字
textFile.close() #关闭文件
return result #返回结果,也就是返回省或直辖市的名字
def age(dateOfBirth) : #计算年龄
todayYear = int(datetime.now().year) #得到今天的年份
todayMonth = int(datetime.now().month) #得到今天的月份
todayDay = int(datetime.now().day) #得到今天的日期
result = todayYear - int(dateOfBirth[0:4]) #今天的年份减去出生年份
if int(dateOfBirth[4:6]) > todayMonth : #判断月份,是否已经过了生日,如果没有过生日,那么result算出来的年份减一
result -=1
if int(dateOfBirth[4:6]) == todayMonth : #判断日期,是否已经过了生日,原理同月份
if int(dateOfBirth[6:]) > todayDay :
result -=1
return result
def gender(num) : #判断性别
if int(num)%2 == 0 : #根据第17位数字表示性别,奇数表示男性,偶数表示女性
return "女性"
else :
return "男性"
#主函数
idNum = input("请输入身份证号码:")
while (judTorF(idNum) == False) :
idNum = input("输入身份证为假,请重新输入:")
print("输入身份证为真")
print("年龄为:{}".format(age(idNum[6:14]))) #传入身份证的第7—14位数字表示出生年月日
print("性别为:{}".format(gender(idNum[16:17]))) #传入身份证的第17位数字表示性别
print("省份为:{}".format(province(idNum[:2]))) #传入身份证的前1—2位数字表示省或直辖市代码
省份编号.txt
编号 省份名
11 北京市
12 天津市
13 河北省
14 山西省
15 内蒙古自治区
21 辽宁省
22 吉林省
23 黑龙江省
31 上海市
32 江苏省
33 浙江省
34 安徽省
35 福建省
36 江西省
37 山东省
41 河南省
42 湖北省
43 湖南省
44 广东省
45 广西壮族自治区
46 海南省
50 重庆市
51 四川省
52 贵州省
53 云南省
54 西藏自治区
61 陕西省
62 甘肃省
63 青海省
64 宁夏回族自治区
65 新疆维吾尔自治区
71 台湾省
81 香港特别行政区
82 澳门特别行政区