使用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解析XML的四种方式
Mar 30 Python
python实现神经网络感知器算法
Dec 20 Python
在pycharm上mongodb配置及可视化设置方法
Nov 30 Python
django rest framework 实现用户登录认证详解
Jul 29 Python
tensor和numpy的互相转换的实现示例
Aug 02 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
Aug 05 Python
PyQt Qt Designer工具的布局管理详解
Aug 07 Python
Window系统下Python如何安装OpenCV库
Mar 05 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
Mar 05 Python
Python 给下载文件显示进度条和下载时间的实现
Apr 02 Python
python单例模式的应用场景实例讲解
Feb 24 Python
Python竟然能剪辑视频
May 25 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
通过PHP的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
浅析PHP中Collection 类的设计
2013/06/21 PHP
php使用memcoder将视频转成mp4格式的方法
2015/03/12 PHP
深入理解PHP中的count函数
2016/05/31 PHP
php加密解密字符串示例
2016/10/13 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
JavaScript 程序编码规范
2010/11/23 Javascript
有关javascript的性能优化 (repaint和reflow)
2013/04/12 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
求js数组的最大值和最小值的四种方法
2017/03/03 Javascript
微信小程序动态显示项目倒计时效果
2017/06/13 Javascript
js图片上传的封装代码
2017/08/01 Javascript
JS返回顶部实例代码
2020/08/09 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
2020/04/09 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
vue实现移动端触屏拖拽功能
2020/08/21 Javascript
[01:02]2014 DOTA2国际邀请赛中国区预选赛 现场抢先看
2014/05/22 DOTA
[01:19]2014DOTA2国际邀请赛 采访TITAN战队ohaiyo 能赢DK很幸运
2014/07/12 DOTA
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
python自动发送邮件脚本
2018/06/20 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
2019/02/12 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
简单了解python 生成器 列表推导式 生成器表达式
2019/08/22 Python
pycharm修改file type方式
2019/11/19 Python
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
咖啡馆创业计划书
2014/01/26 职场文书
企业承诺书格式
2014/05/21 职场文书
初中学习计划书范文
2014/09/15 职场文书
2014年全国爱牙日宣传活动方案
2014/09/21 职场文书
MySQL创建管理RANGE分区
2022/04/13 MySQL