Python 编写的身份证校验工具。直接上代码,欢迎有兴趣的朋友交流指正,共同进步。
import datetime
import openpyxl
weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
ws = openpyxl.load_workbook('行政区划代码.xlsx')['Sheet1']
code_data = dict(list(ws.iter_rows(values_only=True)))
while True:
ID = input('请输入身份证号(如需退出请输入“Q”):')
if ID == 'Q':
print('谢谢使用,再见!')
break
else:
if len(ID) == 18: # 身份证号长度是否为18位
if ID[0:17].isdigit(): # 前17位是否为数字
id17 = list(map(int, list(ID[0:17]))) # 将前17位转换为数字列表
address = code_data.get(ID[0:6], "地址不详")
if int(ID[6:10]) in range(1900, int(datetime.datetime.now().strftime('%Y')) + 1):
if int(ID[6:14]) <= int(datetime.datetime.now().strftime("%Y%m%d")): # 判断出生年份是否晚于当前日期
try:
datetime.date.fromisoformat(ID[6:14])
mod = sum(list(map(lambda x, y: x * y, id17, weight))) % 11
if str(check[mod]) == ID[-1]: # 判断余数与对应的校验码是否匹配
print(f'\t校验无误,性别[{"女" if int(ID[-2]) % 2 == 0 else "男"}],户籍地址为:{address}')
else:
print(f'\t身份证末位校验码不正确(应为[{check[mod]}])')
except ValueError as err:
print(f'\t出生日期[{ID[6:10]}年{ID[10:12]}月{ID[12:14]}日]不是合法的日期!', err)
else:
print(f'\t出生日期[{ID[6:14]}]不应晚于当前日期[{datetime.datetime.now().strftime("%Y%m%d")}]')
else:
print(f'\t出生年份{ID[6:10]}错误,应介于[1900--{datetime.datetime.now().strftime("%Y")}]年之间')
else:
print('\t身份证前17位应全部为数字')
else:
print('\t身份证长度应为18位')
print()