使用Python完成15位18位身份证的互转功能


Posted in Python onNovember 06, 2019

使用Python完成15位18位身份证的互转功能 

最近工作中刚好要清洗一批客户数据,涉及到身份证号码15位和18位的转换,特意研究了下,在这里分享下。

身份证号码的构成

既然谈到了身份证转换,那就需要先了解下证件号码的构成。

使用Python完成15位18位身份证的互转功能 

公民身份号码是特征组合码,由 十七位数字本体码 和 一位数字校验码 组成;

排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

六位数字地址码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T 2260 的规定执行。

八位数字出生日期码:表示编码对象出生的年、月、日,按 GB/T 7408 的规定执行。年、月、日代码之间不用分隔符。某人出生日期为 1995年08月12日,其出生日期码为 19950812。

三位顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

一位校验码:校验码按照 ISO 7064:1983.MOD 11-2校验码计算出来的检验码。

校验码计算方法

1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;

2、将这17位数字和系数相乘的结果相加;

3、用加出来和除以11,看余数是多少;

4、余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为 1 0 X 9 8 7 6 5 4 3 2 ;

5、通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的X。

解决思路

15位转18位:即身份证号码的前六位数字+  '19' +  身份证第六位以后的数字 +  校验码

(不要问我为什么加19这种白痴(´⊙ω⊙`) @?¥&?的问题,当然是因为只有19世纪的人才可能拥有15位的身份证号啦)

校验码计算方法就更简单了,将这17位数字和系数相乘的结果相加除以11匹配余数对应的号码即可。

注意:代码中我用了几个变量,在这里拆解讲解下。

Ai: 表示第i位置上的身份证号码数字值 Wi: 表示第i位置上的加权因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

十七位数字本体码加权求和公式: S = Sum(AiWi), i = 0, … , 16 ,先对前17位数字的权求和

计算模 Y = mod(S, 11)

通过模得到对应的校验码

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

校验码: 1 0 X 9 8 7 6 5 4 3 2

OK,分析的差不多了,直接看代码。

怎么用代码实现?

# encoding: utf-8
"""
CREATED ON 19-11-05
@AUTHOR: XUSL
"""
WI = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1, ]
VI = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2, ]
DEF GET_VERITY(EIGHTEEN_CARD):
  """
  :PARAM EIGHTEEN_CARD:
  :RETURN:
  """
  AI = []
  REMAINING = ''
  IF LEN(EIGHTEEN_CARD) == 18:
    EIGHTEEN_CARD = EIGHTEEN_CARD[0:-1]
  IF LEN(EIGHTEEN_CARD) == 17:
    S = 0
    FOR I IN EIGHTEEN_CARD:
      AI.APPEND(INT(I))
    FOR I IN RANGE(17):
      S = S + WI[I] * AI[I]
    REMAINING = S % 11
  RETURN 'X' IF REMAINING == 2 ELSE STR(VI[REMAINING])
DEF UP_TO_EIGHTEEN(FIFTEEN_CARD):
  """
  15位转18位
  :PARAM FIFTEEN_CARD:
  :RETURN:
  """
  EIGHTEEN_CARD = FIFTEEN_CARD[0:6] + '19' + FIFTEEN_CARD[6:15]
  RETURN EIGHTEEN_CARD + GET_VERITY(EIGHTEEN_CARD)
DEF DOWN_TO_FIFTEEN(EIGHTEEN_CARD):
  """
  18位转15位
  :PARAM EIGHTEEN_CARD:
  :RETURN:
  """
  RETURN EIGHTEEN_CARD[0:6] + EIGHTEEN_CARD[8:17]
IF __NAME__ == '__MAIN__':
  # 15位转18位
  CARD_1 = UP_TO_EIGHTEEN('632123820927051')
  PRINT(CARD_1)
  # 18位转15位
  CARD_2 = DOWN_TO_FIFTEEN('410125199908222000')
  PRINT(CARD_2)

当然,这只是个小功能,主要还是想分享下代码,如果有同样的处理可以直接​用。

总结

以上所述是小编给大家介绍的使用Python完成15位18位身份证的互转功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python3序列化与反序列化用法实例
May 26 Python
python 简单备份文件脚本v1.0的实例
Nov 06 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
Feb 21 Python
浅谈dataframe中更改列属性的方法
Jul 10 Python
Python 判断文件或目录是否存在的实例代码
Jul 19 Python
python实现周期方波信号频谱图
Jul 21 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
Jan 06 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
Feb 19 Python
SpringBoot实现登录注册常见问题解决方案
Mar 04 Python
python+opencv边缘提取与各函数参数解析
Mar 09 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
Jul 14 Python
python3.8 微信发送服务器监控报警消息代码实现
Nov 05 #Python
python SVD压缩图像的实现代码
Nov 05 #Python
Django REST框架创建一个简单的Api实例讲解
Nov 05 #Python
python中for循环变量作用域及用法详解
Nov 05 #Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
Nov 05 #Python
pytorch torch.expand和torch.repeat的区别详解
Nov 05 #Python
Python socket模块ftp传输文件过程解析
Nov 05 #Python
You might like
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
2011/11/07 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
php生成rss类用法实例
2015/04/14 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
JavaScript 事件查询综合
2009/07/13 Javascript
javascript &&和||运算法的另类使用技巧
2009/11/28 Javascript
jQuery插件uploadify实现ajax效果的图片上传
2016/06/18 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
2016/06/20 Javascript
js实现统计字符串中特定字符出现个数的方法
2016/08/02 Javascript
js实现按钮控制带有停顿效果的图片滚动
2016/08/30 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
前端JS面试中常见的算法问题总结
2016/12/23 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
2017/05/20 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
vue.js轮播图组件使用方法详解
2018/07/03 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
[01:03:09]完美世界DOTA2联赛PWL S2 Forest vs SZ 第二场 11.25
2020/11/26 DOTA
python实现调用其他python脚本的方法
2014/10/05 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
python 迭代器和iter()函数详解及实例
2017/03/21 Python
Python文本处理之按行处理大文件的方法
2018/04/09 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
基于pygame实现童年掌机打砖块游戏
2020/02/25 Python
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
工商管理本科毕业生求职信范文
2013/10/05 职场文书
建筑公司文秘岗位职责
2013/11/29 职场文书
婚前财产公证书
2014/04/10 职场文书
学校班子个人对照检查材料思想汇报
2014/09/27 职场文书
天坛导游词
2015/02/02 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
2016年教师新年寄语
2015/08/18 职场文书
2016年社区“6.26”禁毒日宣传活动总结
2016/04/05 职场文书
MySQL索引是啥?不懂就问
2021/07/21 MySQL
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL