Python实现15位与18位身份证号码互转详解

Cora
Cora
发布时间:2026-10-13| 3人浏览过
原创

本文详细介绍如何利用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位身份证互转的功能,希望能为读者提供帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢对本站的支持!若觉得本文有用,欢迎转载,请注明出处,谢谢!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。