使用 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 Falseelse: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 = 0if 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 %= 11if (var_id[sum])==str(n[17]):print("身份证号规则核验通过,校验码是:",var_id[sum])print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性别:",gender,"\n当地同性别同生日排名:",same)return sumelse: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 Falseelse:return Truedef 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 = 0if 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 %= 11if (var_id[sum])==str(n[17]):print("身份证号规则核验通过,校验码是:",var_id[sum])print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性别:",gender,"\n当地同性别同生日排名:",same)return sumelse: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()):passelse:print("说好的输入数字的呢,拜拜了您嘞")breakselect = 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 进行身份证号校验相关推荐

  1. 用Python进行身份证号校验

    在日常应用中,经常需要输入身份证号,因为号码较长容易录错,因此需要进行实时校验,以尽可能保证输入正确.以下以Python为例,浅聊身份证号码校验的方法. 首先我们需要了解身份证号各个号段的意义.身份证 ...

  2. 用python实现身份证号校验系统

    使用Tkinter作为GUI模块以及python基础,开发一款身份证号码校验的系统. 功能概览: 用户输入身份证号码 从身份证号码得到该用户的地区信息.出生日期.以及身份证号码是否合法 Tkinter ...

  3. python判断真假身份证号

    python判断真假身份证号 ''' python判断真假身份证号 识别一串身份证是否是真实的身份证号码: 公民身份号码是特征组合码,共18位,由十七位数字本体码和一位数字校验码组成. 排列顺序从左至 ...

  4. 利用python识别身份证号后获取年龄和性别信息

    利用python识别身份证号后获取年龄和性别信息 1. 实验目的 利用python识别身份证号后,从身份证号中获取年龄和性别信息 2. 主代码 1. 身份证号码识别 # !/usr/bin/pytho ...

  5. C语言基础入门48篇_26_身份证号校验程序(以身份证的校验方式是实例加深对数组及函数封装的理解、字符-‘0‘得到字符对应的int类型数字)

    本篇根据以二代身份证的校验方式是实例加深对数组及函数封装的理解 1. 第二代身份证号的组成 第二代身份证号为18位,各位数字对应了不同的信息(以下顺序从左往右): AABBCCYYYYMMDDXXXV ...

  6. Java身份证号校验

    面向百度编程 package com.sinosoft.lf.util.common;import java.text.SimpleDateFormat; import java.util.Date; ...

  7. 用python实现身份证号的解析(输出性别,生日,生肖,星座)

    用python实现身份证号的解析,输出性别,生日,生肖,星 实现功能: 1.解析生日 2.解析性别 3.解析所在省份 4.解析生肖,星座 代码如下: ID=input('请输入18位身份证号码:'); ...

  8. 最牛js身份证号校验方法

    最牛js身份证号校验方法: function IdCodeValid(code){ //身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码.出生日期.校验位验证 var city={ ...

  9. python读取身份证号_Python实现身份证号码解析

    中国的居民身份证有18位.其中前17位是信息码,最后1位是校验码.每位信息码可以是0-9的数字,而校验码可以是0-9或X,其中X表示10. 身份证校验码算法: 设18位身份证号序列从左到右为: 引用 ...

最新文章

  1. python爬虫实训心得_Python爬虫小结
  2. 小学计算机课每周几节,小学信息技术课时多少
  3. LeetCode 174. 地下城游戏(DP)
  4. mysql partition 性能_通过分区(Partition)提升MySQL性能
  5. Gstreamer之No package ‘gstreamer-1.0‘ found解决(十一)
  6. vscode使用:tab键插入空格而不是tab
  7. kindle上网看其他网址_原来kindle不止可以看书,快来看看体验版浏览器怎么玩!...
  8. python3网易公开课爬虫实践
  9. LeetCode 430. Flatten a Multilevel Doubly Linked List【链表/DFS/递归/迭代】中等
  10. java编程获取屏幕分辨率_Java及Jquery获取屏幕分辨率的实现代码
  11. 多示例学习 (multi-instance learning, MIL)学习路线 (分类)
  12. Android中模拟点击软件的实现原理探究
  13. 2022广东省安全员A证第三批(主要负责人)考试题库模拟考试平台操作
  14. 在mysql中怎么存储表情符号_Emoji表情符号在MySQL数据库中的存储
  15. [mysql语法错误]--Cannot load connection class because of underlying exception
  16. 控制工程专硕现在属于电子信息类_清华考研辅导班-2020清华大学822控制工程基础考研真题经验参考书...
  17. 下载Chrome应用商店中的插件
  18. VUE双向绑定的原理(简单版)+虚拟DOM 节点的创建和更新
  19. 前端调用高德地图app、百度地图app
  20. minimum required php,今天部署zabbix所遇到问题

热门文章

  1. JavaScript-canvas(画布)初识、刮刮卡简单练习
  2. Clickhouse扩容方案概览
  3. 宏与namespace
  4. Kotlin 协程使用
  5. 纹理映射、三角形的插值:重心坐标(Barycentric Coordinates)、纹理相关问题、纹理太小了、纹理太大了、Mipmap的流程、纹理的应用
  6. Centos7.5下rpm方式安装gitlab-ce
  7. python动态粒子素材_python学习笔记之十:文件和素材
  8. [转载]论红楼“慧纹”即“回文锦”的隐写
  9. 310. 最小高度树(Medium)
  10. C语言——结构体运用 编程统计候选人的得票数。设有3个候选人zhang、li、wang(候选人姓名不区分大小写),10个选民,选民每次输入一个得票的候选人的名字,若选民输错候选人姓名,则按废票处理。