使用python代码进行身份证号校验的实现示例


Posted in Python onNovember 21, 2019

先说,还有很多可以优化的地方。

1、比如加入15位身份证号的校验,嗯哼,15位的好像没有校验,那就只能提取个出生年月日啥的了。
2、比如判断加入地址数据库,增加输出信息
3、增加时间判断,出生日期大于当前时间的判为非法

代码是老师放了一个提取出生年月日的题目扩展过来的,目前来看代码运行正常,有没有bug就不造了。

身份证号校验规则

话说身份证号校验,最重要的肯定是校验。那么如何校验?如何又有15、18位身份证号之分?

1、1999年07月01日以前使用15位身份证号,也就是第一代身份证
2、二代身份证增加位数至18,多出来的3位分别是出生年份的前两个数字和一位校验码
3、身份证各位置代表信息如下

使用python代码进行身份证号校验的实现示例

4、顺序码的前两位代表当地派出所代码,第三位是对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

5、校验码,身份证号18位,前17位为本体码,最后一位是算出来的校验码。校验规则如下:

前17位分别乘以【7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2】
然后将17个乘积加一块取余11得到一个0-10范围的数字
0-10分别对应【1,0,x,9,8,7,6,5,4,3,2】即校验位数字
出现 x 是因为校验码为10但为了保证号码长度不变,换成了 x

python校验身份证号代码如下:

version1.1

def check_id_length(n):
  if len(str(n)) != 18:
    print("只支持18位身份证号查询")
    return False
  else:
    return True
def check_id_data(n):
    var=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
    var_id=['1','0','x','9','8','7','6','5','4','3','2']
    n = str(n)
    sum = 0
    if int(n[16])%2==0:
      gender="女"
      same=int(int(n[16])/2)
    else:
      gender="男"
      same=int((int(n[16])+1)/2)
    for i in range(0,17):
      sum += int(n[i])*var[i]
    sum %= 11
    if (var_id[sum])==str(n[17]):
      print("身份证号规则核验通过,校验码是:",var_id[sum])
      print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性别:",gender,"\n当地同性别同生日排名:",same)
      return sum
    else:
      print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性别:",gender,"\n当地同性别同生日排名:",same)
      print("但身份证号规则核验失败,校验码应为",var_id[sum],",当前校验码是:",n[17])
      return 0
n = input("请输入18位身份证号:")
if check_id_length(n):
  check_id_data(n)
else:
  print("请重新输入")

代码说明

1、前六行定义了长度校验函数,校验长度是否为 18
2、7-28行定义了校验位验证函数,验证校验位是否正确
3、29-33行调用了上述两行数以完成校验功能

其中

1、第8行定义了加权数字列表,列表元素类型为 int
2、第9行定义了标准校验位列表,列表元素类型为 str
3、第10行将接收到的身份证号转换为 str 类型,以方便切片提出中间位
4、12-17行用于计算身份证号主性别以及当地(派出所管辖范围)同性别同生日人的顺序
5、18-20分别进行了加权求和并取余, 这是也是这段小代码的核心算法
6、21-28进行校验位对比,并输出对比结果,同时提出出生年月日

演示代码,加入显示判断

verion1.2

import time
def check_id_length(n):
  if len(str(n)) != 18:
    print("只支持18位身份证号查询")
    return False
  else:
    return True

def check_id_data(n):
  n = str(n)
  n2 = str(n[:16])
  time_now = int(time.strftime("%Y",time.localtime()))
  is_digit = (not(n2.isdigit())) or (not(n[17].isdigit()) and (n[17]) !="x")
  if (is_digit):
    print("对不起,您这是火星身份证,暂不受理")
  elif (int(n[6:10]))>time_now:
      print(n[6:10],"年的人?您是穿越回来吗?")
  elif (int(n[10:12]))>12:
    print(n[10:12],"月出生?,您是捡来的吧!!")
  elif (int(n[12:14]))>31:
    print(n[12:14],"日出生?,您一定是充话费送的")
  else:
    check_id_data2(n)
def check_id_data2(n):
    var=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
    var_id=['1','0','x','9','8','7','6','5','4','3','2']
    sum = 0
    if int(n[16])%2==0:
      gender="女"
      same=int(int(n[16])/2)
    else:
      gender="男"
      same=int((int(n[16])+1)/2)
    for i in range(0,17):
      sum += int(n[i])*var[i]
    sum %= 11
    if (var_id[sum])==str(n[17]):
      print("身份证号规则核验通过,校验码是:",var_id[sum])
      print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性别:",gender,"\n当地同性别同生日排名:",same)
      return sum
    else:
      print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性别:",gender,"\n当地同性别同生日排名:",same)
      print("但身份证号规则核验失败,校验码应为",var_id[sum],",当前校验码是:",n[17])
      return 0
while(1):
  print("\n菜单,请输入数字\n----------------------")
  print("输入1手动输入身份证号")
  print("输入2选择测试号")
  print("不然就拜拜")
  print("----------------------")
  select = input("\n请输入:")
  if (select.isdigit()):
    pass
  else:
    print("说好的输入数字的呢,拜拜了您嘞")
    break
  select = int(select)
  if (select == 1):
    n = input("请输入18位身份证号:")
    if check_id_length(n):
      check_id_data(n)
    else:
      print("请重新输入")
  elif select == 2:
         print("\n----------------------")
         print("开始校验身份证号:61011519920317602")
         check_id_length(61011519920317602)
         print("\n----------------------")
         print("开始校验身份证号:610115199203176021")
         check_id_data(610115199203176021)
         print("\n----------------------")
         print("开始校验身份证号:610115199203176028")
         check_id_data(610115199203176028)
  else:
         break

代码测试效果如下:

使用python代码进行身份证号校验的实现示例

测试图二:

使用python代码进行身份证号校验的实现示例

测试图三:

使用python代码进行身份证号校验的实现示例

更多测试请自行运行代码!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
学习python处理python编码问题
Mar 13 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
Apr 18 Python
Python3.2中Print函数用法实例详解
May 19 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
Apr 27 Python
Python+pandas计算数据相关系数的实例
Jul 03 Python
解决Tensorflow占用GPU显存问题
Feb 03 Python
Tensorflow:转置函数 transpose的使用详解
Feb 11 Python
Python3 shutil(高级文件操作模块)实例用法总结
Feb 19 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
May 26 Python
Python flask框架端口失效解决方案
Jun 04 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
Jun 29 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 Python
Python 面向对象之封装、继承、多态操作实例分析
Nov 21 #Python
用python画一只可爱的皮卡丘实例
Nov 21 #Python
Python 私有化操作实例分析
Nov 21 #Python
使用python的turtle绘画滑稽脸实例
Nov 21 #Python
使用Python的Turtle绘制哆啦A梦实例
Nov 21 #Python
Python 类的魔法属性用法实例分析
Nov 21 #Python
python画蝴蝶曲线图的实例
Nov 21 #Python
You might like
五款常用mysql slow log分析工具的比较分析
2011/05/22 PHP
使用PHP实现Mysql读写分离
2013/06/28 PHP
php使用glob函数快速查询指定目录文件的方法
2014/11/15 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
PHP7扩展开发之hello word实现方法详解
2018/01/15 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
PHP实现的AES 128位加密算法示例
2019/09/16 PHP
区分JS中的undefined,null,"",0和false
2007/03/08 Javascript
js 操作select相关方法函数
2009/12/06 Javascript
JavaScript高级程序设计 阅读笔记(二十一) JavaScript中的XML
2012/09/14 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
jQuery链式操作实例分析
2015/11/16 Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
2017/09/08 Javascript
Node.js学习之TCP/IP数据通讯(实例讲解)
2017/10/11 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
2019/05/15 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
2021/01/29 Javascript
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
Python中if __name__ == '__main__'作用解析
2015/06/29 Python
python中函数传参详解
2016/07/03 Python
Python实现Linux中的du命令
2017/06/12 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
2017/07/11 Python
Python如何快速上手? 快速掌握一门新语言的方法
2017/11/14 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
python微信公众号之关注公众号自动回复
2018/10/25 Python
对python修改xml文件的节点值方法详解
2018/12/24 Python
Python中如何导入类示例详解
2019/04/17 Python
Python plt 利用subplot 实现在一张画布同时画多张图
2021/02/26 Python
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
.NET是怎么支持多种语言的
2015/02/24 面试题
升国旗仪式主持词
2014/03/19 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
2014年检验科工作总结
2014/11/22 职场文书
公司周年庆典致辞
2015/07/30 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书