Python实战:基于Pandas与校验算法的18位身份证信息解析

Felix
Felix
发布时间:2026-10-12| 5人浏览过
原创

本文介绍使用Python编写的一个身份证信息校验小项目。通过读取Excel区域代码文件,利用Pandas库解析18位身份证中的地区、出生日期及性别信息。重点详解了基于ISO 7064:1983.MOD 11-2标准的校验码算法,包括权值计算、取余映射及真伪判断逻辑,提供完整可运行代码供学习参考。

Python实战小项目:身份证信息校验工具开发

项目目标

开发一个程序,接收用户输入的身份证号码,并输出详细的解析结果。

性别:男 地区:福建省龙岩市永定县 出生年月日:2000年05月01日 出生当日派出所登记的第 1 个男孩 校验码:0 身份证号真伪性:真

所需文件与前置知识

  • 身份证区域代码.xls(数据源文件,已上传)
  • 身份证号码组成结构解析
  • 身份证校验码算法原理

校验码算法逻辑

  • 18位身份证号码由17位信息数据加上1位校验码组成
1到6位 7到14位 15到16位 17位 18位
区域代码 出生年月日 登记所代码 性别 校验码
  • 性别判定规则:第17位数字为奇数表示男性,偶数表示女性

第17位数字含义说明: 1表示第一个登记的男生 3表示第二个登记的男生 以此类推,奇数序列对应男性登记顺序,偶数序列对应女性登记顺序

校验算法详细步骤

  • 将身份证前17位数字分别乘以对应的固定权值,然后求和
  • 将上述求和结果对11取余数
  • 根据计算得到的余数,查找对应的校验码字符

每一位对应的权值序列(针对17位信息数据,从左往右,第一位对应7,第二位对应9,依次类推)

weights=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]

余数与校验码对应字典(当余数为2时,对应罗马数字“X”,代表数值10)

verification_dict={0:1,
                   1:0,
                   2:"X",
                   3:9,
                   4:8,
                   5:7,
                   6:6,
                   7:5,
                   8:4,
                   9:3,
                   10:2}

完整代码展示(鼓励读者先尝试独立实现)

import pandas as pd
import numpy as np
data = pd.read_excel('身份证区域代码完整版.xls')

# 读取18位身份证
sfz=input()

# 对身份证信息切片
position=int(sfz[0:6])
birthday=sfz[6:14]
police_code=sfz[14:16]
sex_code=int(sfz[16])
verification=int(sfz[17])

# 获取区域名字,如福建省龙岩市永定县
position_name=data.iloc[data.loc[data['代码'] == position].index[0]]['名称']

# 确定性别,并确定是该登记所第几个登记的
def sex(n):
    train_list=[]
    male_list=[1,3,5,7,9]
    female_list=[0,2,4,6,8]
    if n in male_list:
        train_list.append('男')
        train_list.append(male_list.index(n)+1)
    else:
        train_list.append('女')
        train_list.append(female_list.index(n)+1)
    return train_list

# 校验算法
weights=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
sfz_code=[]
for item in sfz:
    sfz_code.append(int(item))
    
weights_sfz=[]

for i in sfz_code:
    for j in weights:
        weights_sfz.append(i*j)

# 找到余数
target=sum(weights_sfz)%11

verification_dict={0:1,
                   1:0,
                   2:"X",
                   3:9,
                   4:8,
                   5:7,
                   6:6,
                   7:5,
                   8:4,
                   9:3,
                   10:2}

# 找到余数对应的第18位校验码
def verification_whether(target_n):
    return verification_dict[target_n]

# 看看输入的身份证校验码和算出来的校验码是否一致,如果不一致,则是假身份证
def verification_true_false(sfz_verification,target_n_whether):
    if sfz_verification == target_n_whether:
        return "真"
    else:
        return "假"

# 将结果格式化打印出来
print("性别     :",sex(sex_code)[0])
print("地区     :",position_name)
print("出生年月日: {}年{}月{}日".format(birthday[0:4],birthday[4:6],birthday[6:8]))
print("出生当日派出所登记的第 {} 个{}孩".format(sex(sex_code)[1],sex(sex_code)[0]))
print("校验码:",verification)
print("身份证号真伪性:",verification_true_false(verification,verification_whether(target)))

才疏学浅,代码诸多不足,欢迎交流学习! Jay Kwong

到此这篇关于Python实战小项目之身份证信息校验的文章就介绍到这了,更多相关Python 身份证校验内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。