使用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自动zip压缩目录的方法
Jun 28 Python
Python抓取框架 Scrapy的架构
Aug 12 Python
浅析Git版本控制器使用
Dec 10 Python
浅析python协程相关概念
Jan 20 Python
Python实现的银行系统模拟程序完整案例
Apr 12 Python
Django分页功能的实现代码详解
Jul 29 Python
python3实现用turtle模块画一棵随机樱花树
Nov 21 Python
python字符串下标与切片及使用方法
Feb 13 Python
pandas 强制类型转换 df.astype实例
Apr 09 Python
Python pip使用超时问题解决方案
Aug 03 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
Nov 26 Python
python随机打印成绩排名表
Jun 23 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下载文件名中的中文乱码问题解决方法
2015/03/05 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
php实现异步将远程链接上内容(图片或内容)写到本地的方法
2016/11/30 PHP
js变量作用域及可访问性的探讨
2006/11/23 Javascript
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
jquery多行滚动/向左或向上滚动/响应鼠标实现思路及代码
2013/01/23 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
JS中input表单隐藏域及其使用方法
2017/02/13 Javascript
JS实现加载和读取XML文件的方法详解
2017/04/24 Javascript
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
Vue路由守卫之路由独享守卫
2019/09/25 Javascript
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
使用Python的Flask框架来搭建第一个Web应用程序
2016/06/04 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
Python机器学习之决策树算法实例详解
2017/12/06 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
2019/06/27 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
慕尼黑山地运动、户外服装和体育用品专家:Sporthaus Schuster
2019/08/27 全球购物
研发工程师的岗位职责
2013/11/18 职场文书
军训生自我鉴定范文
2013/12/27 职场文书
问卷调查计划书
2014/01/10 职场文书
公司年会演讲稿范文
2014/01/11 职场文书
推荐信模板
2014/05/09 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
经典毕业生求职信
2014/07/12 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
《全神贯注》教学反思
2016/02/22 职场文书
Pytorch 实现变量类型转换
2021/05/17 Python
Python利用folium实现地图可视化
2021/05/23 Python
如何用vue实现网页截图你知道吗
2021/11/17 Vue.js
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers