使用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使用pyhook监控键盘并实现切换歌曲的功能
Jul 18 Python
python使用marshal模块序列化实例
Sep 25 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
解决python3 urllib 链接中有中文的问题
Jul 16 Python
python ipset管理 增删白名单的方法
Jan 14 Python
局域网内python socket实现windows与linux间的消息传送
Apr 19 Python
python使用Pandas库提升项目的运行速度过程详解
Jul 12 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
pytorch实现mnist分类的示例讲解
Jan 10 Python
Python如何将装饰器定义为类
Jul 30 Python
Pyinstaller打包Scrapy项目的实现步骤
Sep 22 Python
pytorch 两个GPU同时训练的解决方案
Jun 01 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初学者常见问题集合 修正版(21问答)
2010/03/23 PHP
PHP调用MySQL存储过程并返回值的方法
2014/12/26 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
jQuery入门知识简介
2010/03/04 Javascript
Dom 学习总结以及实例的使用介绍
2013/04/24 Javascript
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
JavaScript显示当前文档最后修改日期的方法
2015/03/19 Javascript
JavaScript模拟实现继承的方法
2015/03/30 Javascript
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
2018/12/18 Javascript
node.js实现上传文件功能
2019/07/15 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
通过vue写一个瀑布流插件代码实例
2019/09/07 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
微信小程序抽奖组件的使用步骤
2021/01/11 Javascript
[35:34]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python入门篇之字典
2014/10/17 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
在Python中定义一个常量的方法
2018/11/10 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
2020/02/10 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
Python 解析xml文件的示例
2020/09/29 Python
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
2016/03/14 HTML / CSS
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
教师个人自我鉴定
2014/02/08 职场文书
奖学金感谢信
2015/01/21 职场文书
药店营业员岗位职责
2015/04/14 职场文书
导游词之山东八大关
2019/12/18 职场文书
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android
Android移动应用开发指南之六种布局详解
2022/09/23 Java/Android