一、安装 pandas 和 openpyxl 库
pip install pandas openpyxl
二、Python代码
import pandas as pdimport redef validate_id_card(id_number):""" 校验身份证号码并返回详细信息 """# 基础清洗 id_number = str(id_number).strip()# 1. 格式检查 (18位)if len(id_number) != 18:return {"原始号码": id_number,"校验结果": "无效","错误原因": "号码长度不是18位","出生日期": "","性别": "","省份": "" }# 2. 正则检查 (前17位数字,最后一位数字或X)if not re.match(r'^\d{17}[\dXx]$', id_number):return {"原始号码": id_number,"校验结果": "无效","错误原因": "包含非法字符","出生日期": "","性别": "","省份": "" }# 3. 校验码计算 (GB 11643-1999) factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] check_codes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'] weighted_sum = sum(int(id_number[i]) * factors[i] for i in range(17)) remainder = weighted_sum % 11 calculated_code = check_codes[remainder]if calculated_code != id_number[17].upper():return {"原始号码": id_number,"校验结果": "无效","错误原因": "校验码错误","出生日期": "","性别": "","省份": "" }# 4. 提取信息 (如果校验通过)# 出生日期 birth_year = id_number[6:10] birth_month = id_number[10:12] birth_day = id_number[12:14] birth_date = f"{birth_year}-{birth_month}-{birth_day}"# 性别 (第17位,奇数男,偶数女) gender = "男"if int(id_number[16]) % 2 == 1 else"女"# 省份 (简单的映射表,可根据需要扩充) province_map = {"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 = province_map.get(id_number[:2], "未知地区")return {"原始号码": id_number,"校验结果": "有效","错误原因": "","出生日期": birth_date,"性别": gender,"省份": province }def main(): input_file = 'ids.txt'# 输入文件名 output_file = '身份证校验结果.xlsx'# 输出文件名print(f"正在读取文件: {input_file} ...")# 读取记事本文件 try: with open(input_file, 'r', encoding='utf-8') as f:# 按行读取,去除空白行 raw_ids = [line.strip() for line in f.readlines() if line.strip()] except FileNotFoundError:print(f"错误:找不到文件 {input_file},请确保文件在当前目录下。")returnprint(f"共找到 {len(raw_ids)} 个号码,开始校验...")# 批量处理 results = []for id_num in raw_ids: info = validate_id_card(id_num) results.append(info)# 转换为 DataFrame df = pd.DataFrame(results)# 调整列顺序 df = df[['原始号码', '校验结果', '错误原因', '出生日期', '性别', '省份']]# 保存到 Excelprint(f"正在保存结果到: {output_file} ...") df.to_excel(output_file, index=False)print("✅ 处理完成!")print(f"有效号码:{len(df[df['校验结果'] == '有效'])}")print(f"无效号码:{len(df[df['校验结果'] == '无效'])}")if __name__ == "__main__": main()
三、在代码同一目录下新建一个文本文件 ids.txt,复制进去需要检测的身份证号
四、运行Python程序
五、程序运行结束后,目录中会生成 身份证校验结果.xlsx
六、运行结果
正在读取文件: ids.txt ...共找到 4 个号码,开始校验...正在保存结果到: 身份证校验结果.xlsx ...✅ 处理完成!有效号码:1无效号码:3