在日常应用中,经常需要输入身份证号,因为号码较长容易录错,因此需要进行实时校验,以尽可能保证输入正确。以下以Python为例,浅聊身份证号码校验的方法。

首先我们需要了解身份证号各个号段的意义。身份证号共18位,其中前6位是行政区划编码,7--14位是出生日期(格式为xxxx年xx月xx日),15--17位是顺序编码(其中第17位是性别编码,奇数代表男,偶数代表女),最后第18位则是校验码。前17位都是数字,最后一位校验码共11个,分别是0,1,2,3,4,5,6,7,8,9,Ⅹ(不是字母X,是罗马数字的10,也可以当做数字理解)。

校验码是如何生成的呢?是根据前17位进行系数运算得来的。

系数运算又是怎么回事呢?其实很简单,请记住10个系数和他们的循环顺序,依次是: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的其中一个),将这个余数按顺序与1,0,X,9,8,7,6,5,4,3,2对应即为校验码。

如果你还有点晕,那么看看下面的实例就会明白了。

如有身份证号为:42058219721014003?(这里先隐去校验码),共17位,将第1位4乘以7得到28,第2位2乘以9得到18,第3位0乘以10得到0,.....第17位3乘以2得到6,将17个乘积相加。

身份证号 4 2 0 5 8 2 1 9 7 2 1 0 1 4 0 0 3 累加值
校验系数 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
对应乘积 28 18 0 25 64 8 2 9 42 6 7 0 10 20 0 0 6 245

各个乘积累加值为245,将其除以11,余数为3,按以下对应表得知,余数3对应的校验码为9,因此该身份码末位校验码就是9,即完整的身份证号为420582197210140039。

余数 0 1 2 3 4 5 6 7 8 9 10

对应

校验码

1 0 X 9 8 7 6 5 4 3 2

好了,基本理论弄明白了,下面来分析下代码该做些什么。其实代码很低简单,只是要考虑的问题多一点,整理如下:

1、身份证长度必须为18位长,前17位必须为数字(最后一位如果是X,也可以当做数字处理,为方便本例只处理前17位)

2、出生日期必须是合法的日历格式(包括判断是否闰年)

3、出生年份应介于1900年--当前年份之间(含)

4、出生日期不能晚于当天

5、校验码必须正确(本例的重点)

若以上规则校验通过,则提示身份证号校验无误,并根据第17位判断出性别予以提示。

好了,最后直接上代码。本人也是初学者,出于兴趣聊做此文,在代码上未能做到尽善尽美,欢迎点评完善。

import time

import datetime

coeff = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]

check = [1,0,'X',9,8,7,6,5,4,3,2]

while True:

today = datetime.datetime.now().strftime('%Y%m%d')

year = time.localtime(time.time())[0]

ID = input('请输入身份证号:')

if ID != 'Q':

if len(ID) == 18:

if ID[0:17].isdigit():

if int(ID[6:10]) in range(1900, year + 1):

if int(ID[6:14])  <= int(today):

try:

time.strptime(ID[6:14], "%Y%m%d")

tmp = 0

for i in range(0,17):

tmp = tmp + int(ID[i]) * coeff[i]

mod = tmp % 11

sex = '女' if int(ID[-2])%2 == 0 else '男'

if str(check[mod]) == ID[-1]:

print(f'\t********此身份证号校验无误,性别为[{sex}]********')

else:

print(f'\txxxx身份证末位校验码"{ID[-1]}"不正确(应为"{check[mod]}")xxxx')

except:

print(f'\t出生日期[{ID[6:14]}:年月日]不是合法的格式,请重新输入!')

else:

print(f'\t出生日期[{ID[6:14]}]不应晚于当前日期[{today}],请重新输入!')

else:

print(f'\t出生年份{ID[6:10]}错误,应介于[1900--{year}]年之间,请重新输入!')

else:

print('\t身份证前17位应全部为数字,请重新输入!')

else:

print('\t身份证长度应为18位,请重新输入。')

else:

print('\t谢谢使用,再见!')

break

用Python进行身份证号校验相关推荐

  1. 使用 python 进行身份证号校验

    使用 python 代码进行身份证号校验 先说,还有很多可以优化的地方. 1.比如加入15位身份证号的校验,嗯哼,15位的好像没有校验,那就只能提取个出生年月日啥的了. 2.比如判断加入地址数据库,增 ...

  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. unity不规则碰撞_Unity UGUI学习系列(二) ------ PolygonCollider2D实现不规则碰撞范围
  2. RT-Thread与智能车比赛
  3. 负载均衡沙龙活动第二期现场问答汇集
  4. MySQLWorkbench链接MySQL数据库
  5. zigbee 频谱波段
  6. mysql 删除另一个表中的_mysql – 在一个查询SQL中删除两个表中的记录
  7. plist java_帮助plist文件
  8. 【AtCoder010】A - Addition(奇偶)
  9. 大学英语综合教程三 Unit 3 课文内容英译中 中英翻译
  10. 谷歌生物医学专用翻译_干货| 三款精选文献翻译神器,助力文献阅读!
  11. 初中计算机excel考试系统,基于Excel构建计算机考试系统
  12. 穿越技术火线,聆听内心声音——暨龙泉第三届IT禅修营
  13. java 读取zip文件_JAVA实现zip文件内容读取及解压
  14. 互联网,大数据和人工智能对我们的生活带来的影响
  15. Python入门数学类编程-----基础数学运算
  16. 宽带加速方法!网速提高30%-200%
  17. cydia软件路径_在Cydia中提取Deb格式安装包文件
  18. 用python画苹果的代码_使用python画个小猪佩奇的示例代码
  19. 【锐捷无线】无线网络优化
  20. CNC脱机源代码 USB雕刻机CNC 3联动 步进电机控制器CNC脱机源代码 STM32F407 USB雕刻机CNC 3轴联动

热门文章

  1. 【转载】MATLB绘图
  2. 2016版excel_excel中yd是什么意思
  3. 这首王维的古诗该如何解析?
  4. 钉钉机器人实现打卡提醒定时任务
  5. CodeVS 1003 电话连线
  6. Android开发UI新技能,你get这个新技能了吗?(附源码详解)
  7. 147. Python语言 的 Flask框架项目前导 之 Flask数据库 第三章 :SQLAlchemy-ORM 介绍
  8. wps 分节符(连续) 自动变成 分节符(下一页) 解决办法
  9. 打造高效能研发团队的 5 个关键步骤
  10. 【题解】文体(划掉)陌上花开