Python编程:提取身份证号中的信息

Python编程:提取身份证号中的信息

题目:

  • 中华人民共和国居民身份证号由17位数字和一位校验码组成。前1—2位数字表示省或直辖市代码、3—-6数字表示市、区的代码;第7—14位数字表示出生年月日;第15—16位数字表示所在地派出所的代码;第17位数字表示性别,奇数表示男性,偶数表示女性;第18位数字是校检码。校验码的生成规则如下:将身份证号码的前17位数分别乘以系数factor(i),结果之和与11求模,结果0-11分别对应last(1,0,X,9,8,7,6,5,4,3,2)。
  • 请编写一个Python程序:输入18位身份证号,辨别身份证号真假,若为假则提示重新输入,若为真则显示身份证中的省份名(代码与地名关系见“省份编号.txt”)、年龄以及性别等。
  • 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”)

代码:

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 澳门特别行政区

你可能感兴趣的:(python练习题,python)