使用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 相关文章推荐
Python 面向对象 成员的访问约束
Dec 23 Python
Python中给List添加元素的4种方法分享
Nov 28 Python
Python书单 不将就
Jul 11 Python
Python3.4编程实现简单抓取爬虫功能示例
Sep 14 Python
获取python文件扩展名和文件名方法
Feb 02 Python
Python用for循环实现九九乘法表
May 31 Python
Python实现正整数分解质因数操作示例
Aug 01 Python
解决python ogr shp字段写入中文乱码的问题
Dec 31 Python
对Python3 goto 语句的使用方法详解
Feb 16 Python
python nmap实现端口扫描器教程
May 28 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
Oct 11 Python
python 如何用map()函数创建多线程任务
Apr 07 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实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
跟我学Laravel之视图 & Response
2014/10/15 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
2015/03/18 PHP
php将字符串转换为数组实例讲解
2020/05/05 PHP
csdn 论坛技术区平均给分功能
2009/11/07 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
js实现的map方法示例代码
2014/01/13 Javascript
把jQuery的类、插件封装成seajs的模块的方法
2014/03/12 Javascript
jQuery的ajax下载blob文件
2016/07/21 Javascript
Javascript动画效果(2)
2016/10/11 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
js Canvas实现的日历时钟案例分享
2016/12/25 Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
2017/04/10 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
原生js实现拖拽功能基本思路详解
2018/04/18 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
怎么理解wx.navigateTo的events参数使用详情
2020/05/18 Javascript
javascript中闭包closure的深入讲解
2021/03/03 Javascript
Python实现远程调用MetaSploit的方法
2014/08/22 Python
wxPython窗口中文乱码解决方法
2014/10/11 Python
python开发之for循环操作实例详解
2015/11/12 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
业务主管岗位职责
2013/11/20 职场文书
出生证明公证书
2014/04/09 职场文书
个人自查自纠材料
2014/10/14 职场文书
房屋租赁协议书
2014/10/18 职场文书
开学典礼致辞
2015/07/29 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
2019个人工作自我评价范文(3篇)
2019/09/19 职场文书
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL
Win11任务栏太宽了怎么办?一招解决Win11任务栏太宽问题
2021/11/21 数码科技