使用python代碼進(jìn)行身份證號校驗(yàn)的實(shí)現(xiàn)示例
先說,還有很多可以優(yōu)化的地方。
1、比如加入15位身份證號的校驗(yàn),嗯哼,15位的好像沒有校驗(yàn),那就只能提取個出生年月日啥的了。
2、比如判斷加入地址數(shù)據(jù)庫,增加輸出信息
3、增加時間判斷,出生日期大于當(dāng)前時間的判為非法
代碼是老師放了一個提取出生年月日的題目擴(kuò)展過來的,目前來看代碼運(yùn)行正常,有沒有bug就不造了。
身份證號校驗(yàn)規(guī)則
話說身份證號校驗(yàn),最重要的肯定是校驗(yàn)。那么如何校驗(yàn)?如何又有15、18位身份證號之分?
1、1999年07月01日以前使用15位身份證號,也就是第一代身份證
2、二代身份證增加位數(shù)至18,多出來的3位分別是出生年份的前兩個數(shù)字和一位校驗(yàn)碼
3、身份證各位置代表信息如下
4、順序碼的前兩位代表當(dāng)?shù)嘏沙鏊a,第三位是對同年、同月、同日出生的人編定的順序號,順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。
5、校驗(yàn)碼,身份證號18位,前17位為本體碼,最后一位是算出來的校驗(yàn)碼。校驗(yàn)規(guī)則如下:
前17位分別乘以【7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2】
然后將17個乘積加一塊取余11得到一個0-10范圍的數(shù)字
0-10分別對應(yīng)【1,0,x,9,8,7,6,5,4,3,2】即校驗(yàn)位數(shù)字
出現(xiàn) x 是因?yàn)樾r?yàn)碼為10但為了保證號碼長度不變,換成了 x
python校驗(yàn)身份證號代碼如下:
version1.1
def check_id_length(n): if len(str(n)) != 18: print("只支持18位身份證號查詢") return False else: return True def check_id_data(n): var=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2] var_id=['1','0','x','9','8','7','6','5','4','3','2'] n = str(n) sum = 0 if int(n[16])%2==0: gender="女" same=int(int(n[16])/2) else: gender="男" same=int((int(n[16])+1)/2) for i in range(0,17): sum += int(n[i])*var[i] sum %= 11 if (var_id[sum])==str(n[17]): print("身份證號規(guī)則核驗(yàn)通過,校驗(yàn)碼是:",var_id[sum]) print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性別:",gender,"\n當(dāng)?shù)赝詣e同生日排名:",same) return sum else: print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性別:",gender,"\n當(dāng)?shù)赝詣e同生日排名:",same) print("但身份證號規(guī)則核驗(yàn)失敗,校驗(yàn)碼應(yīng)為",var_id[sum],",當(dāng)前校驗(yàn)碼是:",n[17]) return 0 n = input("請輸入18位身份證號:") if check_id_length(n): check_id_data(n) else: print("請重新輸入")
代碼說明
1、前六行定義了長度校驗(yàn)函數(shù),校驗(yàn)長度是否為 18
2、7-28行定義了校驗(yàn)位驗(yàn)證函數(shù),驗(yàn)證校驗(yàn)位是否正確
3、29-33行調(diào)用了上述兩行數(shù)以完成校驗(yàn)功能
其中
1、第8行定義了加權(quán)數(shù)字列表,列表元素類型為 int
2、第9行定義了標(biāo)準(zhǔn)校驗(yàn)位列表,列表元素類型為 str
3、第10行將接收到的身份證號轉(zhuǎn)換為 str 類型,以方便切片提出中間位
4、12-17行用于計(jì)算身份證號主性別以及當(dāng)?shù)?派出所管轄范圍)同性別同生日人的順序
5、18-20分別進(jìn)行了加權(quán)求和并取余, 這是也是這段小代碼的核心算法
6、21-28進(jìn)行校驗(yàn)位對比,并輸出對比結(jié)果,同時提出出生年月日
演示代碼,加入顯示判斷
verion1.2
import time def check_id_length(n): if len(str(n)) != 18: print("只支持18位身份證號查詢") return False else: return True def check_id_data(n): n = str(n) n2 = str(n[:16]) time_now = int(time.strftime("%Y",time.localtime())) is_digit = (not(n2.isdigit())) or (not(n[17].isdigit()) and (n[17]) !="x") if (is_digit): print("對不起,您這是火星身份證,暫不受理") elif (int(n[6:10]))>time_now: print(n[6:10],"年的人?您是穿越回來嗎?") elif (int(n[10:12]))>12: print(n[10:12],"月出生?,您是撿來的吧!!") elif (int(n[12:14]))>31: print(n[12:14],"日出生?,您一定是充話費(fèi)送的") else: check_id_data2(n) def check_id_data2(n): var=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2] var_id=['1','0','x','9','8','7','6','5','4','3','2'] sum = 0 if int(n[16])%2==0: gender="女" same=int(int(n[16])/2) else: gender="男" same=int((int(n[16])+1)/2) for i in range(0,17): sum += int(n[i])*var[i] sum %= 11 if (var_id[sum])==str(n[17]): print("身份證號規(guī)則核驗(yàn)通過,校驗(yàn)碼是:",var_id[sum]) print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性別:",gender,"\n當(dāng)?shù)赝詣e同生日排名:",same) return sum else: print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性別:",gender,"\n當(dāng)?shù)赝詣e同生日排名:",same) print("但身份證號規(guī)則核驗(yàn)失敗,校驗(yàn)碼應(yīng)為",var_id[sum],",當(dāng)前校驗(yàn)碼是:",n[17]) return 0 while(1): print("\n菜單,請輸入數(shù)字\n----------------------") print("輸入1手動輸入身份證號") print("輸入2選擇測試號") print("不然就拜拜") print("----------------------") select = input("\n請輸入:") if (select.isdigit()): pass else: print("說好的輸入數(shù)字的呢,拜拜了您嘞") break select = int(select) if (select == 1): n = input("請輸入18位身份證號:") if check_id_length(n): check_id_data(n) else: print("請重新輸入") elif select == 2: print("\n----------------------") print("開始校驗(yàn)身份證號:61011519920317602") check_id_length(61011519920317602) print("\n----------------------") print("開始校驗(yàn)身份證號:610115199203176021") check_id_data(610115199203176021) print("\n----------------------") print("開始校驗(yàn)身份證號:610115199203176028") check_id_data(610115199203176028) else: break
代碼測試效果如下:
測試圖二:
測試圖三:
更多測試請自行運(yùn)行代碼!
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python實(shí)現(xiàn)身份證號碼解析
- 基于Python的身份證號碼自動生成程序
- Python隨機(jī)生成身份證號碼及校驗(yàn)功能
- Python實(shí)現(xiàn)隨機(jī)生成有效手機(jī)號碼及身份證功能示例
- 一個計(jì)算身份證號碼校驗(yàn)位的Python小程序
- python驗(yàn)證身份證信息實(shí)例代碼
- Python+Opencv身份證號碼區(qū)域提取及識別實(shí)現(xiàn)
- 使用Python完成15位18位身份證的互轉(zhuǎn)功能
- python實(shí)現(xiàn)身份證實(shí)名認(rèn)證的方法實(shí)例
- 用1行Python代碼識別身份證信息實(shí)例
相關(guān)文章
python簡單獲取本機(jī)計(jì)算機(jī)名和IP地址的方法
這篇文章主要介紹了python簡單獲取本機(jī)計(jì)算機(jī)名和IP地址的方法,涉及Python中socket模塊的相關(guān)使用技巧,需要的朋友可以參考下2015-06-06Python計(jì)算一個給定時間點(diǎn)前一個月和后一個月第一天的方法
這篇文章主要介紹了Python計(jì)算一個給定時間點(diǎn)前一個月和后一個月第一天的方法,涉及Python使用datetime模塊計(jì)算日期時間的相關(guān)操作技巧,需要的朋友可以參考下2018-05-05python和C++共享內(nèi)存?zhèn)鬏攬D像的示例
這篇文章主要介紹了python和C++共享內(nèi)存?zhèn)鬏攬D像的示例,幫助大家利用python處理圖片,感興趣的朋友可以了解下2020-10-10python tkinter之 復(fù)選、文本、下拉的實(shí)現(xiàn)
這篇文章主要介紹了python tkinter之 復(fù)選、文本、下拉的實(shí)現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03python網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)個性化音樂播放器示例解析
這篇文章主要為大家介紹了使用python網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)個性化音樂播放器的詳細(xì)示例代碼以及內(nèi)容解析,有需要的朋友?可以借鑒參考下希望能夠有所幫助2022-03-03Python可視化學(xué)習(xí)之seaborn調(diào)色盤
seaborn是在matplotlib基礎(chǔ)上封裝的,所以matplotlib的調(diào)色盤seaborn都可以使用。本文系統(tǒng)介紹seaborn調(diào)色盤,相較于matplotlib,有諸多不同,需要的可以參考一下2022-02-02