基于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 相关文章推荐
Python列表append和+的区别浅析
Feb 02 Python
Python自动扫雷实现方法
Jul 25 Python
Python将图片批量从png格式转换至WebP格式
Aug 22 Python
Python部署web开发程序的几种方法
May 05 Python
APIStar:一个专为Python3设计的API框架
Sep 26 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
Jun 21 Python
解决python xx.py文件点击完之后一闪而过的问题
Jun 24 Python
python实现复制大量文件功能
Aug 31 Python
Python实现遗传算法(二进制编码)求函数最优值方式
Feb 11 Python
python实现录屏功能(亲测好用)
Mar 02 Python
Python基础之tkinter图形化界面学习
Apr 29 Python
Python爬虫实战之爬取京东商品数据并实实现数据可视化
Jun 07 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 discuz 主题表和回帖表的设计
2009/03/13 PHP
[原创]php获取数组中键值最大数组项的索引值
2015/03/17 PHP
PHP实现微信发红包程序
2015/08/24 PHP
javascript背投广告代码的完善
2008/04/08 Javascript
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
微信小程序 页面跳转传递值几种方法详解
2017/01/12 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
2017/01/13 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
详解webpack性能优化——DLL
2017/10/20 Javascript
微信小程序获取音频时长与实时获取播放进度问题
2018/08/28 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
JS实现公告上线滚动效果
2021/01/10 Javascript
Python中py文件引用另一个py文件变量的方法
2018/04/29 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
Python中断多重循环的思路总结
2019/10/04 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
Python 执行矩阵与线性代数运算
2020/08/01 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
python实现马丁策略的实例详解
2021/01/15 Python
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
手机配件第一品牌:ZAGG
2017/05/28 全球购物
Discard Protocol抛弃协议的作用是什么
2015/10/10 面试题
销售找工作求职信
2013/12/20 职场文书
2014年学校国庆主题活动方案
2014/09/16 职场文书
个人收入证明模板
2014/09/18 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
大学生自我鉴定怎么写
2019/05/07 职场文书
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL