Python实现15位与18位身份证号码互转详解
本文详细介绍如何利用Python实现15位与18位身份证号码的相互转换。内容涵盖身份证号码的结构组成、18位校验码的计算逻辑(ISO 7064:1983.MOD 11-2标准),并提供完整的Python代码示例,包括加权求和、取模运算及校验字符映射,适用于客户数据清洗场景。
身份证转换背景与意义
近期在处理客户数据清洗工作时,遇到了15位与18位身份证号码转换的需求,经研究后整理出相关方法,在此进行分享。
身份证号码结构解析
身份证号码结构解析
在进行转换之前,首先需要明确身份证号码的具体构成规则。
公民身份号码属于特征组合码,由17位数字本体码和1位数字校验码共同组成。
其排列顺序从左至右依次为:6位数字地址码、8位数字出生日期码、3位数字顺序码以及1位数字校验码。
6位数字地址码:用于表示编码对象常住户口所在县(市、旗、区)的行政区划代码,执行标准为GB/T 2260。
8位数字出生日期码:用于表示编码对象出生的年、月、日,执行标准为GB/T 7408。年、月、日代码之间不使用分隔符。例如,出生日期为1995年08月12日,其对应的出生日期码为19950812。
3位顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号。其中,顺序码的奇数分配给男性,偶数分配给女性。
1位校验码:该校验码是根据ISO 7064:1983.MOD 11-2校验码计算规则得出的检验码。
校验码计算逻辑详解
校验码计算逻辑
1. 将前17位数字分别乘以不同的系数。从第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位转换思路
转换思路分析
15位转18位:即在原身份证号码前6位数字后插入'19',随后接续原第7位至第15位的数字,最后计算并添加校验码。
(此处插入'19'是因为15位身份证仅颁发于19世纪,故年份前补'19'即可还原为4位年份。)
校验码的计算更为直接,只需将生成的17位数字与系数相乘求和,再除以11取余数,匹配对应的校验字符即可。
注意:代码中使用了几个关键变量,此处进行拆解说明。
Ai:表示第i位置上的身份证号码数字值;Wi:表示第i位置上的加权因子,具体值为Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2。
17位数字本体码加权求和公式:S = Sum(AiWi),i = 0, … , 16,即先对前17位数字的权值求和。
计算模:Y = mod(S, 11)。
通过模数Y得到对应的校验码。
Y的取值范围:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10。
对应的校验码:1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2。
分析完毕,接下来查看具体代码实现。
代码实现方式
Python代码实现与示例
# 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位身份证互转的功能,希望能为读者提供帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢对本站的支持!若觉得本文有用,欢迎转载,请注明出处,谢谢!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













