使用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 字典(Dictionary)操作详解
Mar 11 Python
Python实现类似jQuery使用中的链式调用的示例
Jun 16 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
Jun 04 Python
python使用Matplotlib画条形图
Mar 25 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
HTML的form表单和django的form表单
Jul 25 Python
python实现图片二值化及灰度处理方式
Dec 07 Python
简单了解python字符串前面加r,u的含义
Dec 26 Python
浅谈Pycharm最有必要改的几个默认设置项
Feb 14 Python
使用python实现CGI环境搭建过程解析
Apr 28 Python
Django models文件模型变更错误解决
May 11 Python
PyTorch dropout设置训练和测试模式的实现
May 27 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 截取字符串并以零补齐str_pad() 函数
2011/05/07 PHP
mac下使用brew配置环境的步骤分享
2011/05/23 PHP
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
javascript英文日期(有时间)选择器
2007/05/02 Javascript
javascript 闭包
2011/09/15 Javascript
js的.innerHTML = ""IE9下显示有错误的解决方法
2013/09/16 Javascript
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
JavaScript删除指定子元素代码实例
2015/01/13 Javascript
jQuery晃动层特效实现方法
2015/03/09 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
使用AngularJS对路由进行安全性处理的方法
2015/06/18 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
2015/12/03 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
Angular2自定义分页组件
2017/04/19 Javascript
浅析Visual Studio Code断点调试Vue
2018/02/27 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
Vue实现拖放排序功能的实例代码
2019/07/08 Javascript
vue3 源码解读之 time slicing的使用方法
2019/10/31 Javascript
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
Django学习笔记之ORM基础教程
2018/03/27 Python
Python+OpenCV实现实时眼动追踪的示例代码
2019/11/11 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
HTML5中的新元素介绍
2008/10/17 HTML / CSS
美国最大的香水出口:FragranceX.com
2017/11/04 全球购物
园林设计师自荐信
2013/11/18 职场文书
葡萄牙语专业个人求职信
2013/12/10 职场文书
创建文明学校实施方案
2014/03/11 职场文书
介绍信怎么写
2015/05/05 职场文书
音乐剧猫观后感
2015/06/04 职场文书
什么是SOLID
2022/03/24 Javascript