基于Python的身份证号码自动生成程序


Posted in Python onAugust 15, 2014

需求细化:

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

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

下载:GB11643-1999sfz(3water.com).rar

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

  基于Python的身份证号码自动生成程序

  前六位也是国家标准,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 相关文章推荐
Python3指定路径寻找符合匹配模式文件
May 22 Python
python基础知识小结之集合
Nov 25 Python
用tensorflow搭建CNN的方法
Mar 05 Python
使用python爬取B站千万级数据
Jun 08 Python
使用Python的toolz库开始函数式编程的方法
Nov 15 Python
Python 操作 ElasticSearch的完整代码
Aug 04 Python
python将数组n等分的实例
Dec 02 Python
Python中zip函数如何使用
Jun 04 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
python线程池 ThreadPoolExecutor 的用法示例
Oct 10 Python
Selenium环境变量配置(火狐浏览器)及验证实现
Dec 07 Python
详解Go语言运用广度优先搜索走迷宫
Jun 23 Python
Python异常处理总结
Aug 15 #Python
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
Aug 15 #Python
Python3基础之函数用法
Aug 13 #Python
Python3基础之条件与循环控制实例解析
Aug 13 #Python
Python3基础之基本运算符概述
Aug 13 #Python
Python3基础之list列表实例解析
Aug 13 #Python
Python3基础之基本数据类型概述
Aug 13 #Python
You might like
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
javascript写的一个链表实现代码
2009/10/25 Javascript
理解Javascript_09_Function与Object
2010/10/16 Javascript
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
Javascript图像处理—虚拟边缘介绍及使用方法
2012/12/27 Javascript
javascript实现根据身份证号读取相关信息
2014/12/17 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
Bootstrap幻灯片轮播图支持触屏左右手势滑动的实现方法
2016/10/13 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
js微信分享实现代码
2020/10/11 Javascript
vue 2.x 中axios 封装的get 和post方法
2018/02/28 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
Vue 自适应高度表格的实现方法
2020/05/13 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
vue 递归组件的简单使用示例
2021/01/14 Vue.js
python实现给字典添加条目的方法
2014/09/25 Python
Python3生成手写体数字方法
2018/01/30 Python
Python for循环中的陷阱详解
2018/07/13 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
单位成立周年感言
2014/01/26 职场文书
信息与计算科学专业推荐信
2014/02/23 职场文书
学习党的群众路线教育实践活动心得体会
2014/03/01 职场文书
长江三峡导游词
2015/01/31 职场文书
南湾猴岛导游词
2015/02/09 职场文书
2015年物业管理工作总结
2015/04/23 职场文书
高端收音机+蓝牙音箱,JBL TUNER FM带收音蓝牙音箱评测
2021/04/24 无线电