使用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利用SMTP协议发送E-mail电子邮件的方法
Sep 30 Python
用python实现将数组元素按从小到大的顺序排列方法
Jul 02 Python
深入理解python中sort()与sorted()的区别
Aug 29 Python
更改Python的pip install 默认安装依赖路径方法详解
Oct 27 Python
python 定义n个变量方法 (变量声明自动化)
Nov 10 Python
python处理两种分隔符的数据集方法
Dec 12 Python
Python中文编码知识点
Feb 18 Python
python多进程(加入进程池)操作常见案例
Oct 21 Python
Python多线程实现支付模拟请求过程解析
Apr 21 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
May 25 Python
keras.utils.to_categorical和one hot格式解析
Jul 02 Python
详解python变量与数据类型
Aug 25 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
简单采集了yahoo的一些数据
2007/02/14 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
PHP7 echo和print语句实例用法
2019/02/15 PHP
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
React Native中TabBarIOS的简单使用方法示例
2017/10/13 Javascript
js点击时关闭该范围下拉菜单之外的菜单方法
2018/01/11 Javascript
代码详解JS操作剪贴板
2018/02/11 Javascript
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
vue实现在一个方法执行完后执行另一个方法的示例
2018/08/25 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
2018/12/29 jQuery
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
[50:20]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第四局
2016/03/06 DOTA
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
浅谈Python反射 & 单例模式
2019/03/21 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
python Kmeans算法原理深入解析
2019/08/23 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
2020/02/06 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
2020/06/03 Python
对Python 字典元素进行删除的方法
2020/07/31 Python
python使用matplotlib绘制折线图的示例代码
2020/09/22 Python
python实现xml转json文件的示例代码
2020/12/30 Python
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
请说出几个常用的异常类
2013/01/08 面试题
如何查找网页漏洞
2016/06/22 面试题
夜大毕业自我鉴定
2013/10/11 职场文书
大学生职业生涯规划书范文
2014/01/14 职场文书
2014年乡镇人大工作总结
2014/11/25 职场文书
青岛海底世界导游词
2015/02/11 职场文书
卖车协议书范文
2016/03/23 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书