基于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练习程序批量修改文件名
Jan 16 Python
Python检测网站链接是否已存在
Apr 07 Python
详解字典树Trie结构及其Python代码实现
Jun 03 Python
python生成器,可迭代对象,迭代器区别和联系
Feb 04 Python
python 删除非空文件夹的实例
Apr 26 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
Nov 29 Python
Django model 中设置联合约束和联合索引的方法
Aug 06 Python
如何基于Python实现数字类型转换
Feb 07 Python
jupyter notebook 的工作空间设置操作
Apr 20 Python
python logging.info在终端没输出的解决
May 12 Python
使用Python FastAPI构建Web服务的实现
Jun 08 Python
Python pyecharts案例超市4年数据可视化分析
Aug 14 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开发中的页面跳转方法总结
2015/04/26 PHP
简介WordPress中用于获取首页和站点链接的PHP函数
2015/12/17 PHP
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
2014/01/26 Javascript
jquery使用jxl插件导出excel示例
2014/04/14 Javascript
JavaScript中的变量定义与储存介绍
2014/12/31 Javascript
asp.net+js实现金额格式化
2015/02/27 Javascript
jQuery实现图片渐入渐出切换展示效果
2015/08/15 Javascript
深入解析JavaScript中的数字对象与字符串对象
2015/10/21 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
2015/11/24 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
jQuery 插件封装的方法
2016/11/16 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
详解AngularJS通过ocLazyLoad实现动态(懒)加载模块和依赖
2017/03/01 Javascript
Vue.js添加组件操作示例
2018/06/13 Javascript
Python3.0与2.X版本的区别实例分析
2014/08/25 Python
使用python开发vim插件及心得分享
2014/11/04 Python
Python读取mat文件,并保存为pickle格式的方法
2018/10/23 Python
python内置数据类型之列表操作
2018/11/12 Python
Django forms表单 select下拉框的传值实例
2019/07/19 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
2020/04/12 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
iframe在移动端的缩放的示例代码
2018/10/12 HTML / CSS
南非领先的在线旅行社:Travelstart南非
2016/09/04 全球购物
英国经典球衣网站:Classic Football Shirts
2017/05/20 全球购物
美国流行背包品牌:JanSport(杰斯伯)
2018/03/02 全球购物
日语翻译个人求职的自我评价
2013/10/14 职场文书
开业典礼主持词
2014/03/21 职场文书
买房协议书
2014/04/11 职场文书
销售目标责任书
2014/07/23 职场文书
保护动物的宣传语
2015/07/13 职场文书
《穷人》教学反思
2016/02/19 职场文书
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js