【Python校验身份证】

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()

你可能感兴趣的:(python)