用Python进行身份证号校验
? ? ? ? 在日常應用中,經常需要輸入身份證號,因為號碼較長容易錄錯,因此需要進行實時校驗,以盡可能保證輸入正確。以下以Python為例,淺聊身份證號碼校驗的方法。
? ? ? ? 首先我們需要了解身份證號各個號段的意義。身份證號共18位,其中前6位是行政區劃編碼,7--14位是出生日期(格式為xxxx年xx月xx日),15--17位是順序編碼(其中第17位是性別編碼,奇數代表男,偶數代表女),最后第18位則是校驗碼。前17位都是數字,最后一位校驗碼共11個,分別是0,1,2,3,4,5,6,7,8,9,Ⅹ(不是字母X,是羅馬數字的10,也可以當做數字理解)。
? ? ? ? 校驗碼是如何生成的呢?是根據前17位進行系數運算得來的。
? ? ? ? 系數運算又是怎么回事呢?其實很簡單,請記住10個系數和他們的循環順序,依次是:7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2。按這個順序分別與身份證前17位對應相乘,再將每個乘積相加得到一個累加值,最后將這個累計值除以11,得到一個余數(可能是0,1,2,3,4,5,6,7,8,9,10的其中一個),將這個余數按順序與1,0,X,9,8,7,6,5,4,3,2對應即為校驗碼。
? ? ? ? 如果你還有點暈,那么看看下面的實例就會明白了。
? ? ? ? 如有身份證號為:42058219721014003?(這里先隱去校驗碼),共17位,將第1位4乘以7得到28,第2位2乘以9得到18,第3位0乘以10得到0,.....第17位3乘以2得到6,將17個乘積相加。
| 身份證號 | 4 | 2 | 0 | 5 | 8 | 2 | 1 | 9 | 7 | 2 | 1 | 0 | 1 | 4 | 0 | 0 | 3 | 累加值 |
| 校驗系數 | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 | 6 | 3 | 7 | 9 | 10 | 5 | 8 | 4 | 2 | |
| 對應乘積 | 28 | 18 | 0 | 25 | 64 | 8 | 2 | 9 | 42 | 6 | 7 | 0 | 10 | 20 | 0 | 0 | 6 | 245 |
各個乘積累加值為245,將其除以11,余數為3,按以下對應表得知,余數3對應的校驗碼為9,因此該身份碼末位校驗碼就是9,即完整的身份證號為420582197210140039。
| 余數 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| ? 對應 校驗碼 | 1 | 0 | X | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
? ? ? ? 好了,基本理論弄明白了,下面來分析下代碼該做些什么。其實代碼很低簡單,只是要考慮的問題多一點,整理如下:
? ? ? ? 1、身份證長度必須為18位長,前17位必須為數字(最后一位如果是X,也可以當做數字處理,為方便本例只處理前17位)
? ? ? ? 2、出生日期必須是合法的日歷格式(包括判斷是否閏年)
? ? ? ? 3、出生年份應介于1900年--當前年份之間(含)
? ? ? ? 4、出生日期不能晚于當天
? ? ? ? 5、校驗碼必須正確(本例的重點)
? ? ? ? 若以上規則校驗通過,則提示身份證號校驗無誤,并根據第17位判斷出性別予以提示。
? ? ? ? 好了,最后直接上代碼。本人也是初學者,出于興趣聊做此文,在代碼上未能做到盡善盡美,歡迎點評完善。
import time
import datetime
coeff = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
check = [1,0,'X',9,8,7,6,5,4,3,2]
while True:
? ? today = datetime.datetime.now().strftime('%Y%m%d')
? ? year = time.localtime(time.time())[0]
? ? ID = input('請輸入身份證號:')
? ? if ID != 'Q':
? ? ? ? if len(ID) == 18:
? ? ? ? ? ? if ID[0:17].isdigit():
? ? ? ? ? ? ? ? if int(ID[6:10]) in range(1900, year + 1):
? ? ? ? ? ? ? ? ? ? if int(ID[6:14]) ?<= int(today):
? ? ? ? ? ? ? ? ? ? ? ? try:
? ? ? ? ? ? ? ? ? ? ? ? ? ? time.strptime(ID[6:14], "%Y%m%d")
? ? ? ? ? ? ? ? ? ? ? ? ? ? tmp = 0
? ? ? ? ? ? ? ? ? ? ? ? ? ? for i in range(0,17):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tmp = tmp + int(ID[i]) * coeff[i]
? ? ? ? ? ? ? ? ? ? ? ? ? ? mod = tmp % 11
? ? ? ? ? ? ? ? ? ? ? ? ? ? sex = '女' if int(ID[-2])%2 == 0 else '男'
? ? ? ? ? ? ? ? ? ? ? ? ? ? if str(check[mod]) == ID[-1]:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? print(f'\t********此身份證號校驗無誤,性別為[{sex}]********')
? ? ? ? ? ? ? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? print(f'\txxxx身份證末位校驗碼"{ID[-1]}"不正確(應為"{check[mod]}")xxxx')
? ? ? ? ? ? ? ? ? ? ? ? except:
? ? ? ? ? ? ? ? ? ? ? ? ? ? print(f'\t出生日期[{ID[6:14]}:年月日]不是合法的格式,請重新輸入!')
? ? ? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? ? ? print(f'\t出生日期[{ID[6:14]}]不應晚于當前日期[{today}],請重新輸入!')
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? print(f'\t出生年份{ID[6:10]}錯誤,應介于[1900--{year}]年之間,請重新輸入!')
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? print('\t身份證前17位應全部為數字,請重新輸入!')
? ? ? ? else:
? ? ? ? ? ? print('\t身份證長度應為18位,請重新輸入。')
? ? else:
? ? ? ? print('\t謝謝使用,再見!')
? ? ? ? break
總結
以上是生活随笔為你收集整理的用Python进行身份证号校验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java打印日期序列_Java8新特性之
- 下一篇: python 爬取起点中文网的小说(学习