使用 python 进行身份证号校验

摘要:
要使用python代码验证ID编号,有很多地方可以优化。身份证号码验证规则就身份证号码的验证而言,最重要的必须是验证。验证规则如下:前17位数字彼此相乘,然后将17个乘积加上余数11,得到0-10范围内的数字。也就是说,验证数字的数字x出现是因为验证码是10,但为了确保数字的长度不变,用于验证xpython中的ID号的代码更改如下:version1.1defcheck_ID_length:iflen!
使用 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,"
当地同性别同生日排名:",same)
            return sum
        else:
            print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性别:",gender,"
当地同性别同生日排名:",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,"
当地同性别同生日排名:",same)
            return sum
        else:
            print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性别:",gender,"
当地同性别同生日排名:",same)
            print("但身份证号规则核验失败,校验码应为",var_id[sum],",当前校验码是:",n[17])
            return 0
while(1):
    print("
菜单,请输入数字
----------------------")
    print("输入1手动输入身份证号")
    print("输入2选择测试号")
    print("不然就拜拜")
    print("----------------------")
    select = input("
请输入:")
    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("
----------------------")
                 print("开始校验身份证号:61011519920317602")
                 check_id_length(61011519920317602)
                 print("
----------------------")
                 print("开始校验身份证号:610115199203176021")
                 check_id_data(610115199203176021)
                 print("
----------------------")
                 print("开始校验身份证号:610115199203176028")
                 check_id_data(610115199203176028)
    else:
                 break

代码测试效果如下:
测试图一
测试图二:

测试图二
测试图三:

测试图三

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

免责声明:文章转载自《使用 python 进行身份证号校验》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇shell脚本(一)docker容器备份、恢复和迁移volume方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python获取教务管理系统的MM照片

前提:你的教务管理系统是明文存储大家的图片,加密的图片就不好弄了... 也就是能够通过浏览器直接访问...技术上就不存在什么问题了...如果是学号存储的就更方便了 然后我们就可以写个小脚本了...其实就是直接url获取然后保存在本地... 第一个python小脚本...练手玩一玩... 如果要效率高可以用多线程... 大家就可以愉快的找到MM的照片啦!...

Python(2.7)-文件操作(file)

3.1文件操作(files)               Python提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用file对象做大部分的文件操作        3.1.1打开文件 3.1.1.1 open()             Python内置了一个打开文件的函数open(),用来打开一个文件,创建一个file对象,然后你就可以对该打...

从 Android 到 AI 之路

       高煥堂  misoo.tw@qq.com  从 Android 到 AI 之路:Java与Python 携手同行           1.以Python撰写 AI模型框架(Framework) 2.准备Java与Python协同开发环境 3.在Android Studio里撰写Python程序  4.一个基本的AI建模议题:分类的标签设定 5...

opencv+opencv_contrib 人脸识别和检测 python开发环境快速搭建(30分钟)图文教程

很多朋友为了学习python、ML(机器学习)、DL(深度学习)、opencv等花费了大量时间配置安装环境(一个朋友花了4天时间才配置好)各种搜索、下载、安装配置,出问题等。 市面上的配置资料很多,选择也成为了难题,实际上呢,很多高效的方法提供给了我们,比如一些集成套件等。本文基于对大量资料的查询、对比和验证,发现利用现有资源,搭建集成开发环境约30...

python的认识

自己对于python一直都很感兴趣,但一直都只知道它是一个很不错的编程语言,而且如今使用的人也越来越多了,最近自己的课少了些,自己也想着手做点什么事,想来想去,就打算学习一下python,自己通过室友那得到了python的学习视频,想通过学习视频来学习python。接下来简单介绍一下python Python是一种计算机程序设计语言。是一种面向对象的动态类...

使用boost.python进行混合开发

使用boost.python进行混合开发 原文请参照官网和各方参考,本文有改动! 参考链接:http://blog.csdn.net/lanbing510/article/details/12197901 引言: 1简介: Boost.Python 是Boost的一个组件。而Boost是目前很红火的准C++标准库,它提供了很多组件使得人们可以用C++语言更...