python小項目–身份證信息校驗
目的
制作個程序,輸入身份證號碼,輸出如下信息
性別 : 男
地區 : 福建省龍巖市永定縣
出生年月日: 2000年05月01日
出生當日派出所登記的第 1 個男孩
校驗碼: 0
身份證號真偽性: 真
所需文件與知識
- 身份證區域代碼.xls(已上傳)
- 身份證號碼組成
- 身份證校驗碼算法
校驗碼算法
- 18位身份證=17位信息數據+1位校驗碼
1到6位 | 7到14位 | 15到16位 | 17位 | 18位 |
---|---|---|---|---|
區域代碼 | 出生年月日 | 登記所代碼 | 性別 | 校驗碼 |
- 性別:男生為奇數,女生為偶數
1表示第一個登記的男生
3表示第二個登記的男生
以此類推
校驗算法詳解
- 1到17位 每位 乘以 對應的權值 再求和
- 將結果對11取余數
- 根據余數找到對應的校驗碼
每一位對應的權值(17位信息數據,從左往右,第一位對應7,第二位對應9,以此類推)
1
|
weights = [ 7 , 9 , 10 , 5 , 8 , 4 , 2 , 1 , 6 , 3 , 7 , 9 , 10 , 5 , 8 , 4 , 2 ] |
余數與校驗碼對應字典(2對應羅馬數字“X”–十)
1
2
3
4
5
6
7
8
9
10
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 } |
完整代碼展示(你可以自己先做)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
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 身份證校驗內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/JChunking/article/details/120849597