程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

使用python代碼進行身份證號校驗的實現示例

編輯:Python

大家好 我是政胤 今天教大家使用python代碼進行身份證號校驗的實現示例

 

先說身份證號校驗規則

話說身份證號校驗,最重要的肯定是校驗。那麼如何校驗?如何又有15、18位身份證號之分?

1、1999年07月01日以前使用15位身份證號,也就是第一代身份證
2、二代身份證增加位數至18,多出來的3位分別是出生年份的前兩個數字和一位校驗碼
3、身份證各位置代表信息如下

4、順序碼的前兩位代表當地派出所代碼,第三位是對同年、同月、同日出生的人編定的順序號,順序碼的奇數分配給男性,偶數分配給女性。

5、校驗碼,身份證號18位,前17位為本體碼,最後一位是算出來的校驗碼。校驗規則如下:

前17位分別乘以【7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2】
然後將17個乘積加一塊取余11得到一個0-10范圍的數字
0-10分別對應【1,0,x,9,8,7,6,5,4,3,2】即校驗位數字
出現 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("身份證號規則核驗通過,校驗碼是:",var_id[sum])
      print("出生於:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性別:",gender,"\n當地同性別同生日排名:",same)
      return sum
    else:
      print("出生於:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性別:",gender,"\n當地同性別同生日排名:",same)
      print("但身份證號規則核驗失敗,校驗碼應為",var_id[sum],",當前校驗碼是:",n[17])
      return 0
n = input("請輸入18位身份證號:")
if check_id_length(n):
  check_id_data(n)
else:
  print("請重新輸入")

代碼說明

1、前六行定義了長度校驗函數,校驗長度是否為 18
2、7-28行定義了校驗位驗證函數,驗證校驗位是否正確
3、29-33行調用了上述兩行數以完成校驗功能

其中

1、第8行定義了加權數字列表,列表元素類型為 int
2、第9行定義了標准校驗位列表,列表元素類型為 str
3、第10行將接收到的身份證號轉換為 str 類型,以方便切片提出中間位
4、12-17行用於計算身份證號主性別以及當地(派出所管轄范圍)同性別同生日人的順序
5、18-20分別進行了加權求和並取余, 這是也是這段小代碼的核心算法
6、21-28進行校驗位對比,並輸出對比結果,同時提出出生年月日

演示代碼,加入顯示判斷

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("身份證號規則核驗通過,校驗碼是:",var_id[sum])
      print("出生於:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性別:",gender,"\n當地同性別同生日排名:",same)
      return sum
    else:
      print("出生於:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性別:",gender,"\n當地同性別同生日排名:",same)
      print("但身份證號規則核驗失敗,校驗碼應為",var_id[sum],",當前校驗碼是:",n[17])
      return 0
while(1):
  print("\n菜單,請輸入數字\n----------------------")
  print("輸入1手動輸入身份證號")
  print("輸入2選擇測試號")
  print("不然就拜拜")
  print("----------------------")
  select = input("\n請輸入:")
  if (select.isdigit()):
    pass
  else:
    print("說好的輸入數字的呢,拜拜了您嘞")
    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

代碼測試效果如下:

測試圖二:

測試圖三:

更多測試請自行運行代碼!

還有很多可以優化的地方。

1、比如加入15位身份證號的校驗,嗯哼,15位的好像沒有校驗,那就只能提取個出生年月日啥的了。
2、比如判斷加入地址數據庫,增加輸出信息
3、增加時間判斷,出生日期大於當前時間的判為非法

制作不易 點個免費的關注支持一下博主吧

我是政胤 期待你的關注

 


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved