日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

用Python进行身份证号校验

發布時間:2023/12/14 python 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用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個乘積相加。

身份證號42058219721014003累加值
校驗系數7910584216379105842
對應乘積281802564829426701020006245

各個乘積累加值為245,將其除以11,余數為3,按以下對應表得知,余數3對應的校驗碼為9,因此該身份碼末位校驗碼就是9,即完整的身份證號為420582197210140039。

余數012345678910

? 對應

校驗碼

10X98765432

? ? ? ? 好了,基本理論弄明白了,下面來分析下代碼該做些什么。其實代碼很低簡單,只是要考慮的問題多一點,整理如下:

? ? ? ? 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进行身份证号校验的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。