当前位置:首页>python>检测中国大陆身份证号码是否符合标准的 Python 程序

检测中国大陆身份证号码是否符合标准的 Python 程序

  • 2026-10-11 08:41:31
检测中国大陆身份证号码是否符合标准的 Python 程序

一、安装 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

最新文章

随机文章