Python实战小项目之身份证信息校验
项目说明
此项目旨在实现对中国大陆身份证号码进行校验的功能,以判断身份证号码的有效性与真实性。
实现方法
身份证号码校验的方法可以分为两种:一种是基于规则的校验方法,另一种是基于算法的校验方法。
- 基于规则的校验方法:通过验证身份证号码的长度、格式、省份、出生日期、性别和校验位等规则,来判断身份证号码是否有效。
- 基于算法的校验方法:通过对身份证号码进行计算和处理,再与校验位进行比对,来判断身份证号码是否真实。
在此项目中,我们将使用基于规则的校验方法来实现身份证号码校验的功能。
详细步骤
步骤一:获取身份证号码
我们首先需要让用户输入身份证号码,可以通过 input
函数获取用户输入的内容,如下所示:
id_num = input("请输入身份证号码:")
步骤二:校验身份证号码长度
根据国家标准,身份证号码的长度为18位。因此,我们需要对用户输入的身份证号码进行长度检验,判断其是否为18位。
if len(id_num) != 18:
print("身份证号码长度错误")
exit()
步骤三:校验身份证号码格式
身份证号码格式如下所示:前六位为行政区划代码、接下来八位为出生年月日、最后四位为顺序编号和校验码。其中,出生年月日采用的是YYYYMMDD的格式,且必须为合法日期。
为了校验身份证号码的格式,我们需要使用Python中的正则表达式模块 re
。具体实现如下:
import re
# 定义身份证号码正则表达式
id_num_pattern = r'^\d{6}(19|20)\d{2}(0[1-9]|1[0-2])([0-2][1-9]|[1-3][0-1])\d{3}[0-9X]$'
# 判断身份证号码格式是否正确
if not re.match(id_num_pattern, id_num):
print("身份证号码格式错误")
exit()
步骤四:校验身份证号码省份
身份证号码的前六位代码表示省、市、县的行政区划代码,其中第1-2位表示省份,第3-4位表示城市,第5-6位表示县区。
我们可以将代码对照表保存为字典,然后通过身份证号码的前两位进行省份校验。代码如下所示:
# 行政区划代码与省份的代码对照表
district_code_dict = {
"11": "北京市",
"12": "天津市",
"13": "河北省",
"14": "山西省",
"15": "内蒙古自治区",
"21": "辽宁省",
"22": "吉林省",
"23": "黑龙江省",
"31": "上海市",
"32": "江苏省",
"33": "浙江省",
"34": "安徽省",
"35": "福建省",
"36": "江西省",
"37": "山东省",
"41": "河南省",
"42": "湖北省",
"43": "湖南省",
"44": "广东省",
"45": "广西壮族自治区",
"46": "海南省",
"50": "重庆市",
"51": "四川省",
"52": "贵州省",
"53": "云南省",
"54": "西藏自治区",
"61": "陕西省",
"62": "甘肃省",
"63": "青海省",
"64": "宁夏回族自治区",
"65": "新疆维吾尔自治区",
"71": "台湾省",
"81": "香港特别行政区",
"82": "澳门特别行政区",
}
# 提取身份证号码前两位,用于校验省份
province_code = id_num[:2]
# 判断省份是否正确
if province_code not in district_code_dict.keys():
print("省份代码错误")
exit()
步骤五:校验身份证号码出生日期和性别
身份证号码的第7位到第14位是出生日期,其中第7位和第8位是年份,第9位和第10位是月份,第11位和第12位是日期。根据这些数据可以判断出身份证持有人的出生日期。
同时,身份证号码的倒数第二位是奇数表示男性,偶数表示女性。我们可以利用这一规律来校验身份证号码的性别。
# 获取身份证号码中的出生日期和性别
if int(id_num[16]) % 2 == 0:
gender = "女"
else:
gender = "男"
birthday_str = id_num[6:14]
birthday_year = int(birthday_str[0:4])
birthday_month = int(birthday_str[4:6])
birthday_day = int(birthday_str[6:8])
# 判断出生日期是否合法
import datetime
try:
birthday = datetime.datetime.strptime(birthday_str, '%Y%m%d')
except ValueError:
print("身份证号码的出生日期格式错误")
exit()
步骤六:校验身份证号码校验位
校验位是身份证号码的最后一位,它是通过前面17位计算得到的。校验位的计算方法是:
- 将身份证号码前17位分别乘以不同的系数:第1位乘以7,第2位乘以9,第3位乘以10,第4位乘以5,第5位乘以8,……,第16位乘以2,第17位乘以1。
- 将这17个乘积相加,得到一个结果S。
- 将结果S除以11取余数M。
- 根据余数M,得到对应的校验位,校验位的计算方法如下表所示:
余数M | 校验位P |
---|---|
0 | 1 |
1 | 0 |
2 | X |
3 | 9 |
4 | 8 |
5 | 7 |
6 | 6 |
7 | 5 |
8 | 4 |
9 | 3 |
10 | 2 |
我们可以使用下列代码实现校验号码的校验位:
# 计算校验位
weight_list = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check_code_list = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
checksum = sum([int(id_num[i]) * weight_list[i] for i in range(17)]) % 11
check_code = check_code_list[checksum]
# 判断校验位是否正确
if id_num[-1] != check_code:
print('身份证号码校验位错误')
exit()
步骤七:输出身份证号码信息
经过以上步骤的校验,如果身份证号码有效,则输出身份证号码的信息。
print("身份证号码:%s" % id_num)
print("省份:%s" % district_code_dict[province_code])
print("出生日期:%s" % birthday.strftime('%Y年%m月%d日'))
print("性别:%s" % gender)
实例演示
假设用户输入的身份证号码是:440524197510201256
请输入身份证号码:440524197510201256
身份证号码:440524197510201256
省份:广东省
出生日期:1975年10月20日
性别:男
再来一个例子,用户输入的是错误的身份证号码:32058219980916706X
请输入身份证号码:32058219980916706X
身份证号码格式错误
总结
通过本文的身份证号码校验实现过程,可以学习到如下几点内容:
- Python中的正则表达式模块
re
的使用方法。 - Python中的字典类型的创建和使用方法。
- Python中的字符串截取方法和日期格式化方法的使用。
- Python中的校验码计算方法和位数(17或18位)。
- 进行校验时,需先验证出生日期。
- 身份证号码校验还可以使用算法实现,不过需要消耗更大的计算量。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实战小项目之身份证信息校验 - Python技术站