Python實現(xiàn)身份證號碼驗證的示例代碼
摘要: 該設(shè)計主要使用python語言來實現(xiàn)身份證號驗證程序。它運用 tkinter模塊生成GUI界面。當(dāng)用戶輸入身份證號,按下檢查按鈕,即可判斷身份證號是否正確。該程序簡潔,靈活,執(zhí)行效率高。
關(guān)鍵詞: 身份證號; python;tkinter
1 概述
1.1背景
中華人民共和國居民身份證是國家法定的證明公民個人身份的有效證件。在當(dāng)今社會,有一些不法分子為了躲避法律追捕,偽造身份證的現(xiàn)象也是很普遍的,為了驗證公民的身份證號碼是否符合國家標(biāo)準(zhǔn),設(shè)計一個身份證號碼校驗系統(tǒng)是有必要的。
1.2身份證號碼編碼規(guī)則
(1)前六位表示編碼對象常住戶口所在縣(市、鎮(zhèn)、區(qū))的行政區(qū)劃代碼。1-2位省、自治區(qū)、直轄市代碼; 3-4位地級市、盟、自治州代碼; 5-6位縣、縣級市、區(qū)代碼。
(2)第七位到第十四位表示編碼對象出生的年、月、日,其中年份用四位數(shù)字表示,年、月、日之間不用分隔符。
(3)第十五位到十七位地址碼所標(biāo)識的區(qū)域范圍內(nèi),對同年、月、日出生的人員編定的順序號。其中第十七位奇數(shù)分給男性,偶數(shù)分給女性。
(4)18位為校驗碼是根據(jù)前面十七位數(shù)字碼,按照ISO 7064:1983.MOD 11-2校驗碼計算出來的檢驗碼。如果某人的尾號是0-9,就不會出現(xiàn)X,但如果尾號是10,那么就得用X來代替,X是羅馬數(shù)字的10,用X來代替10,可以保證公民的身份證符合國家標(biāo)準(zhǔn)。最后一位校驗碼的計算方法:首先將前面的身份證號碼17位數(shù)分別乘以不同的系數(shù)。從第一位到第十七位的系數(shù)分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2,接下來將這17位數(shù)字和系數(shù)相乘的結(jié)果相加,然后用加出來的和除以11,看余數(shù),余數(shù)只可能有0-1-2-3-4-5-6-7-8-9-10這11個數(shù)字。其分別對應(yīng)的最后一位身份證的號碼為1-0-X -9-8-7-6-5-4-3-2。通過上述方法可以計算一個人的身份證號是否合法。
1.3身份證號驗證內(nèi)容
(1)前六位是否是已有的歸屬地的號碼。
(2)第七位到第十四位,年份是否在1900到2000中,月份是否在01到12中間,對應(yīng)月份的天數(shù)是否符合(平年2月只有28天)。
(3)第18位檢驗位是否符合要求。
2 系統(tǒng)設(shè)計
2.1.功能模塊設(shè)計
該系統(tǒng)的主要功能是實現(xiàn)身份證號碼的驗證,當(dāng)輸入身份證號碼時,檢測身份證是否正確。

2.1.1 GUI界面設(shè)計
Tkinter 是使用 python 進行窗口視窗設(shè)計的模塊。Tkinter模塊(“Tk 接口”)是Python的標(biāo)準(zhǔn)Tk GUI工具包的接口。作為python 特定的GUI界面,是一個圖像的窗口,tkinter是python 自帶的,可以編輯的GUI界面,我們可以用GUI 實現(xiàn)很多直觀的功能。
- Button:一個簡單的按鈕,用來執(zhí)行一個命令或別的操作。
- Entry:文本輸入域。
- Label:顯示一個文本或圖象。
- Text:格式化文本顯示。允許你用不同的樣式和屬性來顯示和編輯文本。同時支持內(nèi)嵌圖象和窗口。
GUI界面設(shè)計如圖所示:

2.1.2 身份證號驗證
1.前六位驗證:前六已位有確定的歸屬地號碼,我們將這些已有的號碼建立一個名為area列表。提取要檢測號碼的前六位,用if語句判斷是否屬于列表中?如果屬于,再判斷后幾位;如果不屬于,則輸出“身份證地區(qū)非法,錯誤的身份證號碼”。如圖3所示。

2.中間8位驗證:用if語句先行判斷是否為閏年,然后用re模塊進行判斷年月日是否正確。正確,則繼續(xù)判斷最后一位;如果不正確則輸出“身份證號出生日期超出范圍或者含有非法字符,錯誤的身份證號”。如圖所示。

閏年出生日期合法性判斷表達式:[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]’’|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))’’[0-9]{3}[0-9Xx]$
閏年出生日期合法性判斷表達式:[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]’’|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-8]))’’[0-9]{3}[0-9Xx]$
3.最后一位檢驗位驗證: 采用逐位加權(quán)求和得出前17位分別與系數(shù)成績的之和。然后除以11取余數(shù),與相應(yīng)的檢驗位對比,如果相等則輸出“正確的身份證號”;如果不相等,則輸出“身份證號碼校驗錯誤,錯誤的身份證號”。如圖6和圖5。


2.2 數(shù)據(jù)結(jié)構(gòu)設(shè)計
本節(jié)將加權(quán)系數(shù)定義為名為W = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]的列表;對應(yīng)身份證檢驗位定名為IDcard_CHECK = [‘1’, ‘0’, ‘X’, ‘9’, ‘8’, ‘7’, ‘6’, ‘5’, ‘4’, ‘3’, ‘2’]的列表,采用逐位加權(quán)求和,簡化程序,優(yōu)化算法,如圖7所示:

2.3 函數(shù)功能描述
省份證驗證主程序:def check(),當(dāng)點擊按鈕“檢查”,將執(zhí)行此程序。刪除上一個身份證號的輸出結(jié)果,顯示本次輸入的身份證號檢查結(jié)果,并刪除本次輸入框身份證號。方便快捷,節(jié)省時間。
3 程序?qū)崿F(xiàn)
import tkinter as tk # 使用Tkinter前需要先導(dǎo)入
import re
# 第1步,實例化object,建立窗口window
window = tk.Tk()
# 第2步,給窗口的可視化起名字
window.title('Chris')
# 第3步,設(shè)定窗口的大小(長 * 寬)
window.geometry('700x500')
# 第4步,在圖形界面上設(shè)定標(biāo)簽
l = tk.Label(window, text='身份證號驗證', font=('宋體', 30), width=40, height=2)
l1 = tk.Label(window, text='身份證號:', font=('Arial', 16), width=40, height=2)
# 第5步,放置標(biāo)簽
l.place(x=-80, y=0, anchor='nw')
l1.place(x=-100, y=80, anchor='nw')
# 第4步,在圖形界面上設(shè)定輸入框控件entry框并放置
e = tk.Entry(window, show=None, font=('Arial', 20),)
e.place(x=200, y=90, anchor='nw')
# 第5步,定義兩個觸發(fā)事件時的函數(shù)check和delete
def check(): # 按鈕‘檢查'對應(yīng)的函數(shù)
t.delete(1.0, 'end')
IDcard = e.get()
if len(IDcard) != 18:
var = '號碼:' + IDcard + "\n身份證號碼位數(shù)不對!\n錯誤的身份證號碼.\n請重新輸入!\n"
else:
IDcard_add = IDcard[0:6] # 身份證前6位,對應(yīng)歸屬地
IDcard_birth = IDcard[6:14] # 身份證中間8位,對應(yīng)出生日期
IDcard_sex = IDcard[14:17] # 身份證15,,16,17位,對應(yīng)性別
area = {"11": "北京", "12": "天津", "13": "河北", "14": "山西", "15": "內(nèi)蒙古", "21": "遼寧",
"22": "吉林", "23": "黑龍江", "31": "上海", "32": "江蘇", "33": "浙江", "34": "安徽",
"35": "福建", "36": "江西", "37": "山東", "41": "河南", "42": "湖北","43": "湖南",
"44": "廣東", "45": "廣西", "46": "海南", "50": "重慶", "51": "四川", "52": "貴州",
"53": "云南", "54": "西藏", "61": "陜西", "62": "甘肅", "63": "青海", "64": "寧夏",
"65": "新疆", "71": "臺灣", "81": "香港", "82": "澳門", "91": "國外"}
# 地區(qū)校驗
if IDcard[0:2] not in area.keys():
var = '號碼:' + IDcard + '\n身份證地區(qū)非法!\n錯誤的身份證號碼\n'
else:
year = IDcard_birth[0:4] # 出生年份
month = IDcard_birth[4:6] # 出生月份
day = IDcard_birth[6:8] # 出生日
# 出生日期的合法性檢查
# 閏年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]
# |[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
# 平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]
# |[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
if (int(year) % 4 == 0 or (int(year) % 100 == 0 and int(year) % 4 == 0)):
ereg = re.compile('[1-9][0-9]{5}((19[0-9]{2})|(20[0-1][0-8]))((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]'
'|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))'
'[0-9]{3}[0-9Xx]$') # //閏年出生日期的合法性正則表達式
else:
ereg = re.compile('[1-9][0-9]{5}((19[0-9]{2})|(20[0-1][0-8]))((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]'
'|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8])'
')[0-9]{3}[0-9Xx]$') # //平年出生日期的合法性正則表達式
# //測試出生日期的合法性
if (re.match(ereg, IDcard)):
IDcard_check = IDcard[17] # 身份證最后一位
W = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] # 逐位權(quán)數(shù)
IDcard_CHECK = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'] # 身份證檢驗位
IDcard_sum = 0 # 定義累加和
for i in range(0, 17):
IDcard_sum = IDcard_sum + int(IDcard[i]) * W[i] # 逐位加權(quán)求和
IDcard_Check = IDcard_sum % 11 # 取余數(shù)
if IDcard_check != IDcard_CHECK[IDcard_Check]: # 和檢驗位對比
var = '號碼:' + IDcard + '\n身份證號碼校驗錯誤!\n錯誤的身份證號碼\n'
else:
if int(IDcard_sex) % 2 == 0:
var = "正確的身份證號碼! \n" + '號碼:' + IDcard + '\n地區(qū):' + area[IDcard[0: 2]] + \
'\n生日:' + year + '年' + month + '月' + day + '日' + "\n 性別:女\n"
else:
var = "正確的身份證號碼! \n" + '號碼:' + IDcard + '\n地區(qū):' + area[IDcard[0: 2]] + \
"\n生日: " + year + '年' + month + '月' + day + '日' + "\n性別:男 \n"
else:
var = '號碼:' + IDcard + '\n身份證號碼出生日期超出范圍或含有非法字符!\n錯誤的身份證號碼\n'
t.insert('insert', var) # 顯示輸出
e.delete(0, 'end')
# 第6步,創(chuàng)建并放置兩個按鈕分別觸發(fā)兩種情況
b1 = tk.Button(window, text='檢查', width=10, height=2, command = check)
b1.place(x=550, y=80, anchor='nw')
# 第7步,創(chuàng)建并放置一個多行文本框text用以顯示
t = tk.Text(window, font=('宋體', 20), width=38, height=8)
t.place(x=100, y=210, anchor='nw')
# 第8步,主窗口循環(huán)顯示
window.mainloop()
4 小結(jié)
該設(shè)計是一個身份證號驗證系統(tǒng),通過輸入身份證號,即可檢測出身份證號真假,并顯示出來。且每次自動刪除輸入框省份證號和上次的輸出結(jié)果,可重復(fù)檢測多個身份證號,主要設(shè)計的工作可概括如下:
1.初期對身份證號碼進行詳細(xì)分析,查閱有關(guān)資料并翻閱文獻,了解了身份證號每一位數(shù)字所對應(yīng)的含義,然后進行數(shù)據(jù)分析,找出最佳算法。通過python實現(xiàn)了基本的功能。
2.在實現(xiàn)基本功能后,通過查找資料,在Python中用thinter函數(shù)實現(xiàn)了GUI界面,使我們更直觀的看出身份證所顯示的信息。
參考文獻
[1] Eric Matthes,Python編程從入門到實踐[M].北京: 人名郵電出版社,2012.8.
[2] 嚴(yán)蔚敏,吳偉民,數(shù)據(jù)結(jié)構(gòu)[M].北京: 清華大學(xué)出版社,2004.1.
[3] 身份證上的號碼代表啥[J].時代主人,2016(03):29.
[4] 文豐,陳景勝.身份證號里為什么有X[J].應(yīng)用寫作,2013(01):27.
[5] 新一代身份證小知識[J].湖南農(nóng)機,2012(10):39.
[6] 閆治良,王宇晨.利用Excel函數(shù)判斷學(xué)生身份證信息的準(zhǔn)確性[J].電腦編程技巧與維護,2016(03):47-48.
到此這篇關(guān)于Python實現(xiàn)身份證號碼驗證的示例代碼的文章就介紹到這了,更多相關(guān)Python 身份證號碼驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python Autopep8實現(xiàn)按PEP8風(fēng)格自動排版Python代碼
這篇文章主要介紹了python Autopep8實現(xiàn)按PEP8風(fēng)格自動排版Python代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
解決Pytorch中的神坑:關(guān)于model.eval的問題
這篇文章主要介紹了解決Pytorch中的神坑:關(guān)于model.eval的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05
Python虛擬環(huán)境venv實戰(zhàn)過程詳解
Python的虛擬環(huán)境可以幫助我們在同一臺機器上,同時使用不同的Python版本和庫,方便管理和開發(fā),下面這篇文章主要給大家介紹了關(guān)于Python虛擬環(huán)境venv的相關(guān)資料,需要的朋友可以參考下2023-06-06
使用Python開發(fā)一個Ditto剪貼板數(shù)據(jù)導(dǎo)出工具
在日常工作中,我們經(jīng)常需要處理大量的剪貼板數(shù)據(jù),下面將介紹如何使用Python的wxPython庫開發(fā)一個圖形化工具,實現(xiàn)從Ditto數(shù)據(jù)庫中讀取、選擇和導(dǎo)出剪貼板歷史記錄的功能2025-08-08
python網(wǎng)絡(luò)編程調(diào)用recv函數(shù)完整接收數(shù)據(jù)的三種方法
本文主要介紹了python網(wǎng)絡(luò)編程調(diào)用recv函數(shù)完整接收數(shù)據(jù)的三種方法。具有很好的參考價值,下面跟著小編一起來看下吧2017-03-03
python讀取.mat文件及將變量存為.mat文件的詳細(xì)介紹
這篇文章主要給大家介紹了關(guān)于python讀取.mat文件及將變量存為.mat文件的詳細(xì)介紹,?mat文件是matlab的數(shù)據(jù)存儲的標(biāo)準(zhǔn)格式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06

