使用python代碼進(jìn)行身份證號校驗的實現(xiàn)示例
先說,還有很多可以優(yōu)化的地方。
1、比如加入15位身份證號的校驗,嗯哼,15位的好像沒有校驗,那就只能提取個出生年月日啥的了。
2、比如判斷加入地址數(shù)據(jù)庫,增加輸出信息
3、增加時間判斷,出生日期大于當(dāng)前時間的判為非法
代碼是老師放了一個提取出生年月日的題目擴(kuò)展過來的,目前來看代碼運行正常,有沒有bug就不造了。
身份證號校驗規(guī)則
話說身份證號校驗,最重要的肯定是校驗。那么如何校驗?如何又有15、18位身份證號之分?
1、1999年07月01日以前使用15位身份證號,也就是第一代身份證
2、二代身份證增加位數(shù)至18,多出來的3位分別是出生年份的前兩個數(shù)字和一位校驗碼
3、身份證各位置代表信息如下

4、順序碼的前兩位代表當(dāng)?shù)嘏沙鏊a,第三位是對同年、同月、同日出生的人編定的順序號,順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。
5、校驗碼,身份證號18位,前17位為本體碼,最后一位是算出來的校驗碼。校驗規(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】即校驗位數(shù)字
出現(xiàn) x 是因為校驗碼為10但為了保證號碼長度不變,換成了 x
python校驗身份證號代碼如下:
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ī)則核驗通過,校驗碼是:",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īng)為",var_id[sum],",當(dāng)前校驗碼是:",n[17])
return 0
n = input("請輸入18位身份證號:")
if check_id_length(n):
check_id_data(n)
else:
print("請重新輸入")
代碼說明
1、前六行定義了長度校驗函數(shù),校驗長度是否為 18
2、7-28行定義了校驗位驗證函數(shù),驗證校驗位是否正確
3、29-33行調(diào)用了上述兩行數(shù)以完成校驗功能
其中
1、第8行定義了加權(quán)數(shù)字列表,列表元素類型為 int
2、第9行定義了標(biāo)準(zhǔn)校驗位列表,列表元素類型為 str
3、第10行將接收到的身份證號轉(zhuǎn)換為 str 類型,以方便切片提出中間位
4、12-17行用于計算身份證號主性別以及當(dāng)?shù)?派出所管轄范圍)同性別同生日人的順序
5、18-20分別進(jìn)行了加權(quán)求和并取余, 這是也是這段小代碼的核心算法
6、21-28進(jì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],"日出生?,您一定是充話費送的")
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ī)則核驗通過,校驗碼是:",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īng)為",var_id[sum],",當(dāng)前校驗碼是:",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("開始校驗身份證號:61011519920317602")
check_id_length(61011519920317602)
print("\n----------------------")
print("開始校驗身份證號:610115199203176021")
check_id_data(610115199203176021)
print("\n----------------------")
print("開始校驗身份證號:610115199203176028")
check_id_data(610115199203176028)
else:
break
代碼測試效果如下:

測試圖二:

測試圖三:

更多測試請自行運行代碼!
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python+OpenCV實現(xiàn)閾值分割的方法詳解
閾值分割法是一種基于區(qū)域的圖像分割技術(shù),原理是把圖像像素點分為若干類。本文將利用Python+OpenCV實現(xiàn)閾值分割,感興趣的可以了解一下2022-05-05
Python通過模塊化開發(fā)優(yōu)化代碼的技巧分享
模塊化開發(fā)就是把代碼拆成一個個“零件”,該封裝封裝,該拆分拆分,下面小編就來和大家簡單聊聊python如何用模塊化開發(fā)進(jìn)行代碼優(yōu)化吧2025-04-04
由淺入深學(xué)習(xí)TensorFlow MNIST 數(shù)據(jù)集
這篇文章主要由淺入深學(xué)習(xí)的講解TensorFlow MNIST 數(shù)據(jù)集,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09
教你怎么用Python實現(xiàn)GIF動圖的提取及合成
今天教大家一個Python有趣好玩的小功能:將多張圖片轉(zhuǎn)為GIF,同時也可以將一個GIF動圖提取出里面的圖片,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
Python使用pickle模塊報錯EOFError Ran out of input的解決方法
這篇文章主要介紹了Python使用pickle模塊報錯EOFError Ran out of input的解決方法,涉及Python異常捕獲操作處理相關(guān)使用技巧,需要的朋友可以參考下2018-08-08

