鱼C论坛

 找回密码
 立即注册
查看: 5942|回复: 4

[技术交流] 新手练习:身份证校验查询系统

[复制链接]
发表于 2015-11-26 21:15:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是一个新手的练习,请大家指正。
归属地数据文件见附件,下载后去掉.txt后缀。

输入15位身份证转换为18位。输入18位判断校验位是否正确。
根据身份证信息得到:归属地、生日、性别等。

  1. #/usr/bin/env python
  2. # -*- coding:utf-8 -*-

  3. '''
  4. 校验位计算依据:
  5. (1)十七位数字本体码加权求和公式
  6. S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
  7. Ai:表示第i位置上的身份证号码数字值
  8. Wi:表示第i位置上的加权因子
  9. Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
  10. (2)计算模
  11. Y = mod(S, 11)
  12. (3)通过模得到对应的校验码
  13. Y: 0 1 2 3 4 5 6 7 8 9 10
  14. 校验码: 1 0 X 9 8 7 6 5 4 3 2
  15. '''

  16. import pickle
  17. import datetime


  18. def borderline(str1,ch='*'):
  19.     #函数目的是为一行或多行字符串加上一个边框,更美观的输出,*为缺省边框字符
  20.     strLen=0
  21.     for each in str1.splitlines():#找出字符串最长一行的字符数
  22.         if strLen<len(each.encode('gb2312')):strLen=len(each.encode('gb2312'))
  23.         #加上encode('gb2312')是使每个汉字记为2个字符长度
  24.     str2=ch*(strLen+6)+'\n'
  25.     str2=str2+ch+' '*(strLen+4)+ch+'\n'
  26.     for each in str1.splitlines():
  27.         str2=str2+ch+'  '+each+' '*(strLen-len(each.encode('gb2312'))+2)+ch+'\n'
  28.     str2=str2+ch+' '*(strLen+4)+ch+'\n'
  29.     str2=str2+ch*(strLen+6)
  30.     return str2

  31. def checkDate(str1):
  32.     #检查日期数据是否合法
  33.     try:
  34.         global birthday
  35.         birthday=datetime.date(int(str1[6:10]),int(str1[10:12]),int(str1[12:14]))
  36.         check=True
  37.     except:
  38.         check=False
  39.     return check
  40.         
  41. def checkByte(str1):
  42.     #计算校验位
  43.     w=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
  44.     s=0
  45.     for i in range(17):
  46.         s=s+int(str1[i])*w[i]
  47.     check=(1-s)%11#可以s%11再查表得到校验位,根据规律直接计算得出
  48.     if check==10:check='X'
  49.     check=str(check)
  50.     return check

  51. def sex(str1):
  52.     #查看性别
  53.     if int(str1[-2])%2==0:
  54.         return '女'
  55.     else:
  56.         return '男'
  57.    
  58. titleStr='''身份证查验系统
  59. 可将15位身份证转为18位
  60. 可检查校验位是否正确
  61. 可查询身份证归属地等信息'''

  62. f=open('iddata.pkl','rb')#打开归属地数据库
  63. #原始归属地数据为excel格式,修改为字典,并按小甲鱼课程所讲pickle到数据文件
  64. idData=pickle.load(f)#读取字典
  65. f.close()
  66. print(borderline(titleStr))
  67. week=('星期一','星期二','星期三','星期四','星期五','星期六','星期日')
  68. while True:
  69.     code=input('请输入15位或18位身份证号码,输入“q”退出:')
  70.     if code.upper()=='Q':
  71.         break
  72.     if len(code)!=15 and len(code)!=18:
  73.         print('输入位数有误,请重新输入。')
  74.         continue
  75.     if len(code)==15:
  76.         code=code[:6]+'19'+code[6:]+'M'
  77.         #15位身份证按19xx年考虑,先转为18位,校验位暂未‘M’,这样方便后面的判断和计算
  78.     if not (code[:17].isdigit() and (code[-1].isdigit() or code[-1]=='M' or code[-1].upper()=='X')):
  79.         print('输入15位身份证要求全为数字,18位身份证前17位为数字,第18位为数字或字母“X”,请重新输入。')
  80.         continue
  81.     if idData.get(code[:6])==None:
  82.         print('输入的前6位是归属地代码,你输入的归属地查不到,请重新输入。',)
  83.         continue
  84.     if checkDate(code)==False:
  85.         print('15位身份证的7~12位为日期,18位身份证7~14位为日期,输入的日期有误,请重新输入。',)
  86.         continue
  87.     last=checkByte(code)#计算校验位
  88.     if code[-1]=='M':
  89.         code=code[:17]+last
  90.         print('15位转18位身份证号是:',code)
  91.     elif code[-1]!=last:
  92.         code=code[:17]+last
  93.         print('18位身份证校验错误,正确的号码可能是:',code)
  94.     else:
  95.         print('18位身份证校验正确。')
  96.     print('身份证归属地:',idData[code[:6]])
  97.     print('生日:',birthday,week[birthday.weekday()])
  98.     print('年龄:',datetime.datetime.now().year-int(code[6:10]))
  99.     print('性别:',sex(code))
复制代码
output.png

iddata.pkl.txt

190 KB, 下载次数: 113

评分

参与人数 2荣誉 +10 鱼币 +10 贡献 +5 收起 理由
qingchen + 5 + 5 支持楼主!
~风介~ + 5 + 5 + 5 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-27 00:23:35 | 显示全部楼层
之前好像也有一个做身份证验证的作品哦,楼主有时间可以看看哦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-27 09:35:28 | 显示全部楼层
~风介~ 发表于 2015-11-27 00:23
之前好像也有一个做身份证验证的作品哦,楼主有时间可以看看哦~

是的,我在写之前,也看了那个帖子,受益匪浅。
这个程序采用另外的思路,主要是为了练习自己的编程能力。现在看比较繁琐,应该有很大精简优化的余地,也请版主和各位高手指正。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-27 14:10:42 | 显示全部楼层
冬雪雪冬 发表于 2015-11-27 09:35
是的,我在写之前,也看了那个帖子,受益匪浅。
这个程序采用另外的思路,主要是为了练习自己的编程能力 ...

恁地谦虚~
好好加油吧,论坛的今后的发展就靠你们啦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-21 14:47:47 | 显示全部楼层
不错 支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-18 18:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表