logo

Python实战:轻松实现15位与18位身份证号的互转

作者:快去debug2024.08.29 17:15浏览量:18

简介:本文介绍了如何使用Python实现15位与18位身份证号码的相互转换,包括15位升18位及18位降15位的基本逻辑和代码实现,帮助读者理解并处理身份证信息。

引言

身份证号码是公民身份的重要标识,随着国家信息化的发展,身份证号码从早期的15位升级到了现在的18位。在数据处理和验证过程中,经常需要在这两种格式之间进行转换。本文将通过Python语言,详细讲解如何实现这两种身份证号码的互转。

15位身份证号转18位

15位身份证号转换为18位,主要是在原号码的基础上增加年份中的19或20前缀,以及最后一位的校验码。

步骤解析

  1. 年份扩展:将15位身份证中的年份(如780101)转换为18位格式中的年份(如19780101)。
  2. 计算校验码:根据18位身份证的校验码算法,计算并添加最后一位。

Python实现

  1. import hashlib
  2. # 校验码字符集
  3. CHECK_CODE = '10X98765432'
  4. # 权重因子
  5. WEIGHT_FACTORS = (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
  6. # 15位转18位
  7. def convert_15_to_18(id15):
  8. if len(id15) != 15:
  9. raise ValueError('Invalid 15-digit ID number')
  10. # 年份前加19
  11. id17 = '19' + id15[6:10] + id15[10:]
  12. # 计算校验码
  13. sum = 0
  14. for i in range(17):
  15. sum += int(id17[i]) * WEIGHT_FACTORS[i]
  16. mod = sum % 11
  17. return id17 + CHECK_CODE[mod]
  18. # 示例
  19. print(convert_15_to_18('123456789012345')) # 假设的15位身份证号

18位身份证号转15位

由于15位身份证已经停止使用,且信息不完整(缺少世纪年份和校验码),因此从18位转换回15位主要是去除年份中的世纪前缀和最后一位校验码。

Python实现

  1. # 18位转15位
  2. def convert_18_to_15(id18):
  3. if len(id18) != 18:
  4. raise ValueError('Invalid 18-digit ID number')
  5. # 去除年份中的世纪前缀和最后一位校验码
  6. return id18[6:10] + id18[10:17]
  7. # 示例
  8. print(convert_18_to_15('19780101123456789X')) # 假设的18位身份证号

注意事项

  • 转换过程中,请确保输入的身份证号码是有效的。
  • 15位转18位时,如果原号码中的日期不符合逻辑(如2月30日),转换后的结果可能仍然不符合逻辑,但校验码计算是正确的。
  • 18位转15位时,由于信息丢失,转换后的结果可能无法直接用于验证身份。

结论

通过Python实现15位与18位身份证号码的互转,不仅可以帮助我们处理历史数据,还能在需要时快速转换数据格式。希望本文的讲解和代码示例能帮助读者更好地理解和应用这一技术。

相关文章推荐

发表评论