使用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时间模块datetime、time、calendar的使用方法
Jan 13 Python
Python paramiko模块的使用示例
Apr 11 Python
python删除本地夹里重复文件的方法
Nov 19 Python
python pandas 对时间序列文件处理的实例
Jun 22 Python
pycharm远程linux开发和调试代码的方法
Jul 17 Python
Python 实现微信防撤回功能
Apr 29 Python
使用python serial 获取所有的串口名称的实例
Jul 02 Python
opencv转换颜色空间更改图片背景
Aug 20 Python
学python爬虫能做什么
Jul 29 Python
django教程如何自学
Jul 31 Python
深入理解python多线程编程
Apr 18 Python
python实现Thrift服务端的方法
Apr 20 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中慎用双等于(==)的详解
2013/06/06 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
js 获取Listbox选择的值的代码
2010/04/15 Javascript
javascript在当前窗口关闭前检测窗口是否关闭
2014/09/29 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
2015/01/21 Javascript
JavaScript通过setTimeout实时显示当前时间的方法
2015/04/16 Javascript
详解springmvc 接收json对象的两种方式
2016/12/06 Javascript
微信小程序 地图map实例详解
2017/06/07 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
2017/11/06 Javascript
分析JS中this引发的bug
2017/12/12 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
2018/03/03 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
javascript function(函数类型)使用与注意事项小结
2019/06/10 Javascript
JavaScript 实现同时选取多个时间段的方法
2019/10/17 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
Python THREADING模块中的JOIN()方法深入理解
2015/02/18 Python
对dataframe数据之间求补集的实例详解
2019/01/30 Python
用python求一个数组的和与平均值的实现方法
2019/06/29 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
Python爬虫如何应对Cloudflare邮箱加密
2020/06/24 Python
Python爬虫之Selenium鼠标事件的实现
2020/12/04 Python
html5 div布局与table布局详解
2016/11/16 HTML / CSS
NARS化妆品官方商店:美国彩妆品牌
2017/08/26 全球购物
社团招新策划书
2014/02/04 职场文书
陈欧广告词
2014/03/14 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
个人租房协议书范本
2014/09/30 职场文书
入党函调证明材料
2014/12/24 职场文书
年底个人总结范文
2015/03/10 职场文书
党小组推荐意见
2015/06/02 职场文书
2016高三毕业赠言寄语
2015/12/04 职场文书
受欢迎的自荐信,就这么写!
2019/04/19 职场文书
八年级作文之感恩
2019/11/22 职场文书
pytorch 如何使用float64训练
2021/05/24 Python