身份证号码自动生成程序(Python)

今天收到一个小需求:需要一个自动生成身份证号码的小程序。近期用python较多,因此打算用python实现。

 

  需求细化

1.身份证必须能够通过身份证校验程序。

2.通过查询,发现身份证号码是有国家标准的,标准号为  GB 11643-1999  可以从百度下载到这个文档http://zhidao.baidu.com/share/b838c7683bb70af8166efd810a398fec.html

现行身份证号为18位,分别为6位地址码,8位生日,3位顺序码,一位校验码。具体例子可见下图。

前六位也是国家标准,GB2260-2007。吐槽一下,国标竟然没有一个网站供全面检索和免费下载。。。还好国家统计局有这些公开数据。可以从统计数据-》统计标准-》行政区划代码页面内找到最新数据:http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201401/t20140116_501070.html (这个网页上的数据可能会边旧)

出生年月日是8位

顺序码是3位,男生末尾为基数,女生末尾为偶数。

最后一位是校验码。校验算法其实后面有很多数学道理,这里给出最简单的公式:

前17位数字每一位有一个权重值

将第i位上的权重值记作Wi,Wi的值为 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

将身份证第i位的数字记作Ai

则使用下列公式算出一个数

S= Sum(Ai*Wi)  mod 11    ------------- Sum(Ai*Wi) 取11的模。

 

这样S的取值如下表:

对每一个S做一个映射 Y,这样就有如下的表

S:0  1  2  3  4  5  6  7  8  9  10

Y:1  0  X  9  8  7  6  5  4  3  2

Y就是最终的校验码。

原型实现过程:

1.获取区域规划码的list,并读入一个dictionary的list中。dictionary结构如下:

{"state":河北省,"city":沧州市,"district":运河区,"code":130903}

丑陋的原型如下:

def getdistrictcode():
    with open(‘districtcode‘) as file:
        data = file.read()
    districtlist = data.split(‘\n‘)
    global codelist
    codelist = []
    for node in districtlist:
        #print node
        if node[10:11] != ‘ ‘:
            state = node[10:].strip()
        if node[10:11]==‘ ‘and node[12:13]!=‘ ‘:
            city = node[12:].strip()
        if node[10:11] == ‘ ‘and  node[12:13]==‘ ‘:
            district = node[14:].strip()
            code = node[0:6]
            codelist.append({"state":state,"city":city,"district":district,"code":code})

上部你得到了一个codelist,里边有所有的区号了。

下面是生成身份证号的原型,基本上是随机生成

def gennerator():
    id = codelist[random.randint(0,len(codelist))][‘code‘] #地区项
    id = id + str(random.randint(1930,2013)) #年份项
    da  = date.today()+timedelta(days=random.randint(1,366)) #月份和日期项
    id = id + da.strftime(‘%m%d‘)
    id = id+ str(random.randint(100,300))#,顺序号简单处理

    i = 0
    count = 0
    weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] #权重项
    checkcode ={‘0‘:‘1‘,‘1‘:‘0‘,‘2‘:‘X‘,‘3‘:‘9‘,‘4‘:‘8‘,‘5‘:‘7‘,‘6‘:‘6‘,‘7‘:‘5‘,‘8‘:‘5‘,‘9‘:‘3‘,‘10‘:‘2‘} #校验码映射
    for i in range(0,len(id)):
       count = count +int(id[i])*weight[i]
    id = id + checkcode[str(count%11)] #算出校验码
    return id

原型用到了python的两个标准库

from datetime import date
from datetime import timedelta

这样就能初步满足需要了,后续可以根据要就对工具进行细化。

btw,其实,正在开发一个测试数据生成的工具集,近期争取开源。有任何具体需求可以提给我。有想一起做的同学也大大的欢迎:)

身份证号码自动生成程序(Python),布布扣,bubuko.com

时间: 2024-10-24 14:23:32

身份证号码自动生成程序(Python)的相关文章

输入身份证号码自动读取生日与性别(delphi)

一.格式介绍: [15位号码格式] 1.第l一6位数为行政区划代码; 2.第7-12位数为出生日期代码; 3.第13---15位数为分配顺序代码; (1).行政区划代码,是指公民第一次申领居民身份证时的常住户口所在地的行政地区. (2).出生日期代码,第7-8位数代表年份(年份前面二位数省略),第9-10位数代表月份(月份为l位数的前面加零).第11一12位数代表日期(日期为1位数的前面加零). (3).分配顺序代码,是按人口数统一合理分配以固定顺序给予每个人的顺序号,最末一位数是奇数的分配给男

根据身份证号码自动获取出生日期,性别,籍贯

Q1:数据库 由于数据有点多,我们在这就不展示了(需要的联系我,我发给你) i 这是里面所用到的一些架包,包等等.相信大家对这一块都已经了解了,我就不说废话了. Q2:html文件 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <s

我用python算出了同事的身份证号码!

作者:朱小五 来源:凹凸玩数据 事情的经过是这样的: 我的同事李大伟最近出差去了. 昨晚睡觉前翻了翻朋友圈, 就跟他愉快地 互怼 交流了起来. 估计是他想起了我朱小五从不打无把握之赌,后面就怂了. 一杯奶茶嘛,也可以接受, 像杰伦一样快乐就好啦. 开工. 先看看李大伟的朋友圈中发的图片. (该火车票来自其他平行世界,扫描可能发生奇怪现象) 车票中暴露的个人信息为: 3302211993****4914 李大伟 只缺少月份日期四位. 那么也就是一共365种可能. 科普时间: 根据李大伟的身份证信息

python实现获取身份证号码的方法

记录瞬间 1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码.2.地址码 表示编码对象常住户口所在县(县级市.旗.区)的行政区划代码,按GB/T2260的规定执行.3.出生日期码 表示编码对象出生的年.月.日,按GB/T7408的规定执行,年.月.日代码之间不用分隔符.4.顺序码 表示在同一地址码所标识的区域范围内,对同年.同月.同日出生的人编定的顺序号,顺序码的奇数分配给男性,

vue表单:输入身份证号码则自动获取对应的年龄和性别,,若不输入身份证号则自己填写年龄和性别

<el-input :ref="item.meta.system_id" v-model="temp[item.meta.valueKey]" clearable oninput="if(value.length>18)value=value.slice(0,18)" :disabled="item.meta.disabled" :placeholder="item.meta.placeholder ?

使用Excel的函数批量判断身份证号码是否有效

一.描述 现在有一个批量上传用户的需求,其中需要上传用户名.姓名和身份证号码,进行实名批量注册,如何能快速判断用户给的身份证号是否格式正确呢?其实无论是WPS的excel还是Microsoft office中的excel都提供了函数功能,我们只要在单元中调用一定的函数就可以判断该身份证是否符合要求,如果符合,就输出Right,错误就输出Wrong. 二.源代码 =IF(LOOKUP((LEFT(C2,1)*7+MID(C2,2,1)*9+MID(C2,3,1)*10+MID(C2,4,1)*5+

lua身份证号码验证~

--验证身份证信息 --只支持18位身份证的验证 --[[ #身份证18位编码规则:dddddd yyyymmdd xxx y #dddddd:地区码 #yyyymmdd: 出生年月日 #xxx:顺序类编码,无法确定,奇数为男,偶数为女 #y: 校验码,该位数值可通过前17位计算获得 #<p /> #18位号码加权因子为(从右到左) Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,1 ] #验证位 Y = [ 1, 0, 1

C#解决从含身份证号码的Excel表格导入数据库的问题

用C#做从Excel表导入SQL数据库时发现从EXCEL导入的身份证号码会变成科学表示方法. 解决这个问题是比较容易的,首先,打开电子表格,选中“身份证号码”一列,右键选择“设置单元格格式”,进入单元格格式界面,选择“数字”,选中“文本”格式.点击确定,返回原界面.选择身份证号码的第一行,在身份证号码前添加英文单引号('),例如:'450909198812129876 这样,后面的身份证号码会自动转换格式.再导入数据库,问题解决. 补充:数据库中的身份证号码类型最好不要设置为数字一类的,因为身份

详细验证身份证号码规则和姓名(汉字)的java代码

一.验证汉字的正则表达式 /** 是否是汉字的正则 */ private String regexIsHanZi = "[\\u4e00-\\u9fa5]+"; * @param str要匹配的字符串 * @param reg 正则 public static boolean matchRegular(String str, String reg) { Pattern pattern = Pattern.compile(reg); Matcher matcher = pattern.m