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

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

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

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

身份证号校验规则

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

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

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

代码测试效果如下:

测试图二:

测试图三:

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

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

(0)

相关推荐

  • Python实现身份证号码解析

    中国的居民身份证有18位.其中前17位是信息码,最后1位是校验码.每位信息码可以是0-9的数字,而校验码可以是0-9或X,其中X表示10. 身份证校验码算法: 设18位身份证号序列从左到右为: 引用 a[0], a[1], a[2], a[3], ..., a[16], a[17] 其中a[i]表示第i位数字,i=0,1,2,...,17,如果最后一位(校验位)是X,则a[17]=10 每一位被赋予一个"权值",其中,第i位的权值w[i]的计算方法是: 引用 w[i] = 2**(17

  • 一个计算身份证号码校验位的Python小程序

    S = Sum(Ai * Wi), i=0,.......16 (现在的身份证号码都是18位长,其中最后一位是校验位,15位的身份证号码好像不用了) Ai对应身份证号码,Wi则为用于加权计算的值,它一串固定的数值,应该是根据某种规则得出的吧,用于取得最好的随机性,Wi的取之如下: 7   9 10 5 8   4   2   1 6   3   7   9 10  5   8   4   2 经过加权计算之后,得到一个S,用这个S去模11,取余值,然后查表得到校验位,这个索引表如下: 0 ---

  • 基于Python的身份证号码自动生成程序

    需求细化: 1.身份证必须能够通过身份证校验程序. 2.通过查询,发现身份证号码是有国家标准的,标准号为 GB 11643-1999 可以从百度下载到这个文档 下载:GB11643-1999sfz(jb51.net).rar 现行身份证号为18位,分别为6位地址码,8位生日,3位顺序码,一位校验码.具体例子可见下图. 前六位也是国家标准,GB2260-2007.吐槽一下,国标竟然没有一个网站供全面检索和免费下载...还好国家统计局有这些公开数据.可以从统计数据->统计标准->行政区划代码页面内

  • Python随机生成身份证号码及校验功能

    GitHub : https://github.com/jayknoxqu/id-number-util 身份组成方式 中华人民共和国国家标准GB 11643-1999<公民身份号码>中规定:公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成. 18位数字组合的方式是: 1 1 0 1 0 2 Y Y Y Y M M D D 8 8 8 X 区域码(6位) 出生日期码(8位) 顺序码(2位) 性别码(1位) 校验码(1位) 区域码(6位) 出生日期码(8位) 顺序码(2位) 性别码(

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

    先说,还有很多可以优化的地方. 1.比如加入15位身份证号的校验,嗯哼,15位的好像没有校验,那就只能提取个出生年月日啥的了. 2.比如判断加入地址数据库,增加输出信息 3.增加时间判断,出生日期大于当前时间的判为非法 代码是老师放了一个提取出生年月日的题目扩展过来的,目前来看代码运行正常,有没有bug就不造了. 身份证号校验规则 话说身份证号校验,最重要的肯定是校验.那么如何校验?如何又有15.18位身份证号之分? 1.1999年07月01日以前使用15位身份证号,也就是第一代身份证 2.二代

  • python批量生成身份证号到Excel的两种方法实例

    身份证号码的编排规则 前1.2位数字表示:所在省份的代码: 第3.4位数字表示:所在城市的代码: 第5.6位数字表示:所在区县的代码: 第7~14位数字表示:出生年.月.日: 第15.16位数字表示:所在地的派出所的代码: 第17位数字表示性别:奇数表示男性,偶数表示女性: 第18位数字是校检码,计算方法如下: (1)将前面的身份证号码17位数分别乘以不同的系数.从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2. (2)将这17位数字和系数相

  • SqlServer2000+ 身份证合法校验函数的示例代码

    下面看下sqlserver2000身份证校验的代码,具体代码如下所示: /* 身份校验行数 */ if exists(select * from sysobjects where name='fun_utils_idnumberoprater' and type='FN') drop function fun_utils_idnumberoprater go create function fun_utils_idnumberoprater ( @idnumber varchar(50)=''

  • 如何通过50行Python代码获取公众号全部文章

    前言 我们平时阅读公众号的文章会遇到一个问题--阅读历史文章体验不好. 我们知道爬取公众号的方式常见的有两种:通过搜狗搜索去获取,缺点是只能获取最新的十条推送文章.通过微信公众号的素材管理,获取公众号文章.缺点是需要申请自己的公众号. 今天介绍一种通过抓包PC端微信的方式去获取公众号文章的方法.相比其他的方法非常方便. 如上图,通过抓包工具获取微信的网络信息请求,我们发现每次下拉刷新文章的时候都会请求 mp.weixin.qq.com/mp/xxx (公众号不让添加主页链接,xxx表示profi

  • Python实战小项目之身份证信息校验

    python小项目–身份证信息校验 目的 制作个程序,输入身份证号码,输出如下信息 性别 : 男 地区 : 福建省龙岩市永定县 出生年月日: 2000年05月01日 出生当日派出所登记的第 1 个男孩 校验码: 0 身份证号真伪性: 真 所需文件与知识 身份证区域代码.xls(已上传) 身份证号码组成 身份证校验码算法 校验码算法 18位身份证=17位信息数据+1位校验码 1到6位 7到14位 15到16位 17位 18位 区域代码 出生年月日 登记所代码 性别 校验码 性别:男生为奇数,女生为

  • PHP校验15位和18位身份证号的类封装

    新公司框架源码的时候,发现了这个功能,于是搜索一番并封装了一下身份证号校验的类. 目前大家的身份证号大多是 18 位的,当然,也不排除有些老人的身份证号是 15 位的. 如果强制要求是 18 位的话,会比较好,因为 15 位的身份证号没有校验码,可以说,只要了解大概结构,随手都可以造出一系列身份证号码来. 当然,如果只是单纯的程序校验, 18 位的身份证号码也可以伪造,就是需要伪造者花点心思. 最好的还是调用相关部门给的接口,进行校验. 本文所编写的身份证号码校验,只是针对相关规则下的计算,是调

  • Android 快速使用正则表达式,校验身份证号的实例

    开发过程中,会遇到一些常用的正则需求. 比如,校验身份证号是否合法.下面一段简单的代码就能瞬间解决问题啦! StringUtils.java /** * 身份证号校验 * * @param idCard * @return */ public static boolean isIdCardNum(String idCard) { String reg = "^\\d{15}$|^\\d{17}[0-9Xx]$"; if (!idCard.matches(reg)) { System.o

  • java身份证合法性校验工具类实例代码

    1.身份证规则 计算方法(来源百度) 将前面的身份证号码17位数分别乘以不同的系数.从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2. 将这17位数字和系数相乘的结果相加. 用加出来和除以11,看余数是多少? 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字.其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2.(即余数0对应1,余数1对应0,余数2对应X-) 通过上面得知如果余数是3,就会在身份

  • javascript验证身份证号

    我们在做互联网网站时,注册个人资料时,经常要用到身份证号,我们需要对身份证进验证,不然别人随便输个号码就通过,让你感觉这个网站做得很shit. 身份证号是有规则的. 结构和形式 1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 2.地址码 表示编码对象常住户口所在县(市.旗.区)的行政区划代码,按GB/T2260的规定执行. 3.出生日期码 表示编码对象出生的年.月.日,按G

  • Java根据身份证号计算年龄,15位身份证号码转18位原理与操作示例

    本文实例讲述了Java根据身份证号计算年龄,15位身份证号码转18位.分享给大家供大家参考,具体如下: 第一代身份证:15位身份证号码的意义 15位身份证号码各位的含义: 1-2位省.自治区.直辖市代码: 3-4位地级市.盟.自治州代码: 5-6位县.县级市.区代码: 7-12位出生年月日,比如670401代表1967年4月1日,这是和18位号码的第一个区别: 13-15位为顺序号,其中15位男为单数,女为双数: 与18位身份证号的第二个区别:没有最后一位的校验码. 举例: 130503 670

随机推荐