Python实战:轻松实现15位与18位身份证号的互转
2024.08.29 17:15浏览量:18简介:本文介绍了如何使用Python实现15位与18位身份证号码的相互转换,包括15位升18位及18位降15位的基本逻辑和代码实现,帮助读者理解并处理身份证信息。
引言
身份证号码是公民身份的重要标识,随着国家信息化的发展,身份证号码从早期的15位升级到了现在的18位。在数据处理和验证过程中,经常需要在这两种格式之间进行转换。本文将通过Python语言,详细讲解如何实现这两种身份证号码的互转。
15位身份证号转18位
15位身份证号转换为18位,主要是在原号码的基础上增加年份中的19或20前缀,以及最后一位的校验码。
步骤解析
- 年份扩展:将15位身份证中的年份(如780101)转换为18位格式中的年份(如19780101)。
- 计算校验码:根据18位身份证的校验码算法,计算并添加最后一位。
Python实现
import hashlib
# 校验码字符集
CHECK_CODE = '10X98765432'
# 权重因子
WEIGHT_FACTORS = (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
# 15位转18位
def convert_15_to_18(id15):
if len(id15) != 15:
raise ValueError('Invalid 15-digit ID number')
# 年份前加19
id17 = '19' + id15[6:10] + id15[10:]
# 计算校验码
sum = 0
for i in range(17):
sum += int(id17[i]) * WEIGHT_FACTORS[i]
mod = sum % 11
return id17 + CHECK_CODE[mod]
# 示例
print(convert_15_to_18('123456789012345')) # 假设的15位身份证号
18位身份证号转15位
由于15位身份证已经停止使用,且信息不完整(缺少世纪年份和校验码),因此从18位转换回15位主要是去除年份中的世纪前缀和最后一位校验码。
Python实现
# 18位转15位
def convert_18_to_15(id18):
if len(id18) != 18:
raise ValueError('Invalid 18-digit ID number')
# 去除年份中的世纪前缀和最后一位校验码
return id18[6:10] + id18[10:17]
# 示例
print(convert_18_to_15('19780101123456789X')) # 假设的18位身份证号
注意事项
- 转换过程中,请确保输入的身份证号码是有效的。
- 15位转18位时,如果原号码中的日期不符合逻辑(如2月30日),转换后的结果可能仍然不符合逻辑,但校验码计算是正确的。
- 18位转15位时,由于信息丢失,转换后的结果可能无法直接用于验证身份。
结论
通过Python实现15位与18位身份证号码的互转,不仅可以帮助我们处理历史数据,还能在需要时快速转换数据格式。希望本文的讲解和代码示例能帮助读者更好地理解和应用这一技术。
发表评论
登录后可评论,请前往 登录 或 注册