Python實(shí)現(xiàn)身份證號(hào)碼驗(yàn)證的示例代碼
摘要: 該設(shè)計(jì)主要使用python語(yǔ)言來(lái)實(shí)現(xiàn)身份證號(hào)驗(yàn)證程序。它運(yùn)用 tkinter模塊生成GUI界面。當(dāng)用戶輸入身份證號(hào),按下檢查按鈕,即可判斷身份證號(hào)是否正確。該程序簡(jiǎn)潔,靈活,執(zhí)行效率高。
關(guān)鍵詞: 身份證號(hào); python;tkinter
1 概述
1.1背景
中華人民共和國(guó)居民身份證是國(guó)家法定的證明公民個(gè)人身份的有效證件。在當(dāng)今社會(huì),有一些不法分子為了躲避法律追捕,偽造身份證的現(xiàn)象也是很普遍的,為了驗(yàn)證公民的身份證號(hào)碼是否符合國(guó)家標(biāo)準(zhǔn),設(shè)計(jì)一個(gè)身份證號(hào)碼校驗(yàn)系統(tǒng)是有必要的。
1.2身份證號(hào)碼編碼規(guī)則
(1)前六位表示編碼對(duì)象常住戶口所在縣(市、鎮(zhèn)、區(qū))的行政區(qū)劃代碼。1-2位省、自治區(qū)、直轄市代碼; 3-4位地級(jí)市、盟、自治州代碼; 5-6位縣、縣級(jí)市、區(qū)代碼。
(2)第七位到第十四位表示編碼對(duì)象出生的年、月、日,其中年份用四位數(shù)字表示,年、月、日之間不用分隔符。
(3)第十五位到十七位地址碼所標(biāo)識(shí)的區(qū)域范圍內(nèi),對(duì)同年、月、日出生的人員編定的順序號(hào)。其中第十七位奇數(shù)分給男性,偶數(shù)分給女性。
(4)18位為校驗(yàn)碼是根據(jù)前面十七位數(shù)字碼,按照ISO 7064:1983.MOD 11-2校驗(yàn)碼計(jì)算出來(lái)的檢驗(yàn)碼。如果某人的尾號(hào)是0-9,就不會(huì)出現(xiàn)X,但如果尾號(hào)是10,那么就得用X來(lái)代替,X是羅馬數(shù)字的10,用X來(lái)代替10,可以保證公民的身份證符合國(guó)家標(biāo)準(zhǔn)。最后一位校驗(yàn)碼的計(jì)算方法:首先將前面的身份證號(hào)碼17位數(shù)分別乘以不同的系數(shù)。從第一位到第十七位的系數(shù)分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2,接下來(lái)將這17位數(shù)字和系數(shù)相乘的結(jié)果相加,然后用加出來(lái)的和除以11,看余數(shù),余數(shù)只可能有0-1-2-3-4-5-6-7-8-9-10這11個(gè)數(shù)字。其分別對(duì)應(yīng)的最后一位身份證的號(hào)碼為1-0-X -9-8-7-6-5-4-3-2。通過(guò)上述方法可以計(jì)算一個(gè)人的身份證號(hào)是否合法。
1.3身份證號(hào)驗(yàn)證內(nèi)容
(1)前六位是否是已有的歸屬地的號(hào)碼。
(2)第七位到第十四位,年份是否在1900到2000中,月份是否在01到12中間,對(duì)應(yīng)月份的天數(shù)是否符合(平年2月只有28天)。
(3)第18位檢驗(yàn)位是否符合要求。
2 系統(tǒng)設(shè)計(jì)
2.1.功能模塊設(shè)計(jì)
該系統(tǒng)的主要功能是實(shí)現(xiàn)身份證號(hào)碼的驗(yàn)證,當(dāng)輸入身份證號(hào)碼時(shí),檢測(cè)身份證是否正確。
2.1.1 GUI界面設(shè)計(jì)
Tkinter 是使用 python 進(jìn)行窗口視窗設(shè)計(jì)的模塊。Tkinter模塊(“Tk 接口”)是Python的標(biāo)準(zhǔn)Tk GUI工具包的接口。作為python 特定的GUI界面,是一個(gè)圖像的窗口,tkinter是python 自帶的,可以編輯的GUI界面,我們可以用GUI 實(shí)現(xiàn)很多直觀的功能。
- Button:一個(gè)簡(jiǎn)單的按鈕,用來(lái)執(zhí)行一個(gè)命令或別的操作。
- Entry:文本輸入域。
- Label:顯示一個(gè)文本或圖象。
- Text:格式化文本顯示。允許你用不同的樣式和屬性來(lái)顯示和編輯文本。同時(shí)支持內(nèi)嵌圖象和窗口。
GUI界面設(shè)計(jì)如圖所示:
2.1.2 身份證號(hào)驗(yàn)證
1.前六位驗(yàn)證:前六已位有確定的歸屬地號(hào)碼,我們將這些已有的號(hào)碼建立一個(gè)名為area列表。提取要檢測(cè)號(hào)碼的前六位,用if語(yǔ)句判斷是否屬于列表中?如果屬于,再判斷后幾位;如果不屬于,則輸出“身份證地區(qū)非法,錯(cuò)誤的身份證號(hào)碼”。如圖3所示。
2.中間8位驗(yàn)證:用if語(yǔ)句先行判斷是否為閏年,然后用re模塊進(jìn)行判斷年月日是否正確。正確,則繼續(xù)判斷最后一位;如果不正確則輸出“身份證號(hào)出生日期超出范圍或者含有非法字符,錯(cuò)誤的身份證號(hào)”。如圖所示。
閏年出生日期合法性判斷表達(dá)式:[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]$
閏年出生日期合法性判斷表達(dá)式:[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.最后一位檢驗(yàn)位驗(yàn)證: 采用逐位加權(quán)求和得出前17位分別與系數(shù)成績(jī)的之和。然后除以11取余數(shù),與相應(yīng)的檢驗(yàn)位對(duì)比,如果相等則輸出“正確的身份證號(hào)”;如果不相等,則輸出“身份證號(hào)碼校驗(yàn)錯(cuò)誤,錯(cuò)誤的身份證號(hào)”。如圖6和圖5。
2.2 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
本節(jié)將加權(quán)系數(shù)定義為名為W = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]的列表;對(duì)應(yīng)身份證檢驗(yàn)位定名為IDcard_CHECK = [‘1’, ‘0’, ‘X’, ‘9’, ‘8’, ‘7’, ‘6’, ‘5’, ‘4’, ‘3’, ‘2’]的列表,采用逐位加權(quán)求和,簡(jiǎn)化程序,優(yōu)化算法,如圖7所示:
2.3 函數(shù)功能描述
省份證驗(yàn)證主程序:def check(),當(dāng)點(diǎn)擊按鈕“檢查”,將執(zhí)行此程序。刪除上一個(gè)身份證號(hào)的輸出結(jié)果,顯示本次輸入的身份證號(hào)檢查結(jié)果,并刪除本次輸入框身份證號(hào)。方便快捷,節(jié)省時(shí)間。
3 程序?qū)崿F(xiàn)
import tkinter as tk # 使用Tkinter前需要先導(dǎo)入 import re # 第1步,實(shí)例化object,建立窗口window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('Chris') # 第3步,設(shè)定窗口的大小(長(zhǎng) * 寬) window.geometry('700x500') # 第4步,在圖形界面上設(shè)定標(biāo)簽 l = tk.Label(window, text='身份證號(hào)驗(yàn)證', font=('宋體', 30), width=40, height=2) l1 = tk.Label(window, text='身份證號(hào):', 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步,定義兩個(gè)觸發(fā)事件時(shí)的函數(shù)check和delete def check(): # 按鈕‘檢查'對(duì)應(yīng)的函數(shù) t.delete(1.0, 'end') IDcard = e.get() if len(IDcard) != 18: var = '號(hào)碼:' + IDcard + "\n身份證號(hào)碼位數(shù)不對(duì)!\n錯(cuò)誤的身份證號(hào)碼.\n請(qǐng)重新輸入!\n" else: IDcard_add = IDcard[0:6] # 身份證前6位,對(duì)應(yīng)歸屬地 IDcard_birth = IDcard[6:14] # 身份證中間8位,對(duì)應(yīng)出生日期 IDcard_sex = IDcard[14:17] # 身份證15,,16,17位,對(duì)應(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": "臺(tái)灣", "81": "香港", "82": "澳門(mén)", "91": "國(guó)外"} # 地區(qū)校驗(yàn) if IDcard[0:2] not in area.keys(): var = '號(hào)碼:' + IDcard + '\n身份證地區(qū)非法!\n錯(cuò)誤的身份證號(hào)碼\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]$') # //閏年出生日期的合法性正則表達(dá)式 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]$') # //平年出生日期的合法性正則表達(dá)式 # //測(cè)試出生日期的合法性 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'] # 身份證檢驗(yàn)位 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]: # 和檢驗(yàn)位對(duì)比 var = '號(hào)碼:' + IDcard + '\n身份證號(hào)碼校驗(yàn)錯(cuò)誤!\n錯(cuò)誤的身份證號(hào)碼\n' else: if int(IDcard_sex) % 2 == 0: var = "正確的身份證號(hào)碼! \n" + '號(hào)碼:' + IDcard + '\n地區(qū):' + area[IDcard[0: 2]] + \ '\n生日:' + year + '年' + month + '月' + day + '日' + "\n 性別:女\n" else: var = "正確的身份證號(hào)碼! \n" + '號(hào)碼:' + IDcard + '\n地區(qū):' + area[IDcard[0: 2]] + \ "\n生日: " + year + '年' + month + '月' + day + '日' + "\n性別:男 \n" else: var = '號(hào)碼:' + IDcard + '\n身份證號(hào)碼出生日期超出范圍或含有非法字符!\n錯(cuò)誤的身份證號(hào)碼\n' t.insert('insert', var) # 顯示輸出 e.delete(0, 'end') # 第6步,創(chuàng)建并放置兩個(gè)按鈕分別觸發(fā)兩種情況 b1 = tk.Button(window, text='檢查', width=10, height=2, command = check) b1.place(x=550, y=80, anchor='nw') # 第7步,創(chuàng)建并放置一個(gè)多行文本框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è)計(jì)是一個(gè)身份證號(hào)驗(yàn)證系統(tǒng),通過(guò)輸入身份證號(hào),即可檢測(cè)出身份證號(hào)真假,并顯示出來(lái)。且每次自動(dòng)刪除輸入框省份證號(hào)和上次的輸出結(jié)果,可重復(fù)檢測(cè)多個(gè)身份證號(hào),主要設(shè)計(jì)的工作可概括如下:
1.初期對(duì)身份證號(hào)碼進(jìn)行詳細(xì)分析,查閱有關(guān)資料并翻閱文獻(xiàn),了解了身份證號(hào)每一位數(shù)字所對(duì)應(yīng)的含義,然后進(jìn)行數(shù)據(jù)分析,找出最佳算法。通過(guò)python實(shí)現(xiàn)了基本的功能。
2.在實(shí)現(xiàn)基本功能后,通過(guò)查找資料,在Python中用thinter函數(shù)實(shí)現(xiàn)了GUI界面,使我們更直觀的看出身份證所顯示的信息。
參考文獻(xiàn)
[1] Eric Matthes,Python編程從入門(mén)到實(shí)踐[M].北京: 人名郵電出版社,2012.8.
[2] 嚴(yán)蔚敏,吳偉民,數(shù)據(jù)結(jié)構(gòu)[M].北京: 清華大學(xué)出版社,2004.1.
[3] 身份證上的號(hào)碼代表啥[J].時(shí)代主人,2016(03):29.
[4] 文豐,陳景勝.身份證號(hào)里為什么有X[J].應(yīng)用寫(xiě)作,2013(01):27.
[5] 新一代身份證小知識(shí)[J].湖南農(nóng)機(jī),2012(10):39.
[6] 閆治良,王宇晨.利用Excel函數(shù)判斷學(xué)生身份證信息的準(zhǔn)確性[J].電腦編程技巧與維護(hù),2016(03):47-48.
到此這篇關(guān)于Python實(shí)現(xiàn)身份證號(hào)碼驗(yàn)證的示例代碼的文章就介紹到這了,更多相關(guān)Python 身份證號(hào)碼驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
django的auth認(rèn)證,authenticate和裝飾器功能詳解
這篇文章主要介紹了django的auth認(rèn)證,authenticate和裝飾器功能詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07gearman的安裝啟動(dòng)及python API使用實(shí)例
這篇文章主要介紹了gearman的安裝啟動(dòng)及python API使用,需要的朋友可以參考下2014-07-07