Python 身份证校验 Python实战小项目之身份证信息校验
同心圆计算 人气:0想了解Python实战小项目之SFZ信息校验的相关内容吗,同心圆计算在本文为您仔细讲解Python SFZ校验的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Python,SFZ校验,Python,实战,下面大家一起来学习吧。
python小项目–SFZ信息校验
目的
制作个程序,输入SFZ号码,输出如下信息
性别 : 男
地区 : 福建省龙岩市永定县
出生年月日: 2000年05月01日
出生当日派出所登记的第 1 个男孩
校验码: 0
SFZ号真伪性: 真
所需文件与知识
- SFZ区域代码.xls(已上传)
- SFZ号码组成
- SFZ校验码算法
校验码算法
- 18位SFZ=17位信息数据+1位校验码
1到6位 | 7到14位 | 15到16位 | 17位 | 18位 |
---|---|---|---|---|
区域代码 | 出生年月日 | 登记所代码 | 性别 | 校验码 |
- 性别:男生为奇数,女生为偶数
1表示第一个登记的男生
3表示第二个登记的男生
以此类推
校验算法详解
- 1到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”–十)
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('SFZ区域代码完整版.xls') # 读取18位SFZ sfz=input() # 对SFZ信息切片 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] # 看看输入的SFZ校验码和算出来的校验码是否一致,如果不一致,则是假SFZ 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("SFZ号真伪性:",verification_true_false(verification,verification_whether(target)))
才疏学浅,代码诸多不足,欢迎交流学习!
Jay Kwong
加载全部内容