使用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安装第三方库及常见问题处理方法汇总
Sep 13 Python
python3中bytes和string之间的互相转换
Feb 09 Python
详解python调度框架APScheduler使用
Mar 28 Python
利用Python读取文件的四种不同方法比对
May 18 Python
python编写暴力破解zip文档程序的实例讲解
Apr 24 Python
Python 打印中文字符的三种方法
Aug 14 Python
使用pip发布Python程序的方法步骤
Oct 11 Python
Python使用while循环花式打印乘法表
Jan 28 Python
Django中FilePathField字段的用法
May 21 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
python requests模块的使用示例
Apr 07 Python
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
Apr 21 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中使用$_REQUEST需要注意的一个问题
2013/05/02 PHP
PHP使用CURL获取302跳转后的地址实例
2014/05/04 PHP
PHP+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
2015/04/07 Javascript
使用AngularJS创建单页应用的编程指引
2015/06/19 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
基于jquery二维码生成插件qrcode
2017/01/07 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
2017/08/08 jQuery
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
六个窍门助你提高Python运行效率
2015/06/09 Python
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
Python使用django框架实现多人在线匿名聊天的小程序
2017/11/29 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
python字符串循环左移
2019/03/08 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
HTML5进度条特效
2014/12/18 HTML / CSS
HTML5声音录制/播放功能的实现代码
2018/05/03 HTML / CSS
Html5嵌入钉钉的实现示例
2020/06/04 HTML / CSS
英国豪华针织品牌John Smedley的在线销售商:The Outlet by John Smedley
2018/04/08 全球购物
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
某IT外企面试题-二分法求方程!看看大家的C++功底
2015/07/04 面试题
深圳-东方伟业笔试部分
2015/02/11 面试题
abstract是什么意思
2012/02/12 面试题
认购协议书范本
2014/04/22 职场文书
公司演讲稿开场白
2014/08/25 职场文书
2014年全国爱牙日宣传活动方案
2014/09/21 职场文书
抄袭同学作业检讨书1000字
2014/11/20 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
对讲机的最大通讯距离是多少
2022/02/18 无线电
基于Python实现对比Exce的工具
2022/04/07 Python