导语

身份证对于每一个人来说都是极其重要的,你是否有过这样的疑问:某些网站是如何判断身份证的正误的(当然那些直接匹配公安部数据的身份证读卡器就不用多说了),本篇将带你简单的利用Python解决身份证的正误判断问题,并检索一些基础的身份信息。

正文

身份证构成

居民身份证号码,根据[中华人民共和国国家标准[GB11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字行政区划代码,八位数字出生日期码,三位数字顺序码和一位数字校验码。即18位身份证号码末位数字校验码。

出生地区

身份证的第一至六位为本人的籍贯地区代码,通俗的来说,就是全国每个县(区市)都对应唯一的一个行政区划代码。因此我们可以根据数据到中华人民共和国民政部行政区划代码网站查询到相应的地区名称。以某公民[53010219200508011x]身份证为例,此人的出生地区行政区划代码为:530102,出生地为: 云南省昆明市五华区

出生日期

根据身份证的构成我们可以知道,排在6位行政区码之后的八位数字便是出生日期了,以上文[ 53010219200508011x ] 身份证为例,此人的出生日期为: 一九二零年五月八日

男女性别

男女性别的判断则相对容易,判别依据为身份证号码的倒数第二位:奇数为男性,偶数为女性。

正误校验

校验码是根据前十七位数字码,按照ISO7064:1983 MOD11-2校验码计算出来的检验码。

计算方法:
1.将身份证前十七位分别乘以对应的权重并求和记为sum。

2.sum 除以 11 取余数[Python:sum%11],记为 temp。

3.最后用12减去tamp除以11取余数[Python: (12-temp)%11],记为 result。

4.result 可能出现 零至十共,共十一种情况,其中由于身份证位数限制,10记为X 。

身份证数字一至十七权对应权重数分别为(手机版浏览表格可左右滑动):

位号1234567891011121314151617
权重7910584216379105842

Python参考检验过程如下(完整代码中的部分):

def check(self):
    ai = list(self.id[:17])
    wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    result_sum = sum([int(ai[index]) * wi[index] for index in range(len(ai))])
    
    result = (12 - (result_sum % 11)) % 11
    if result == 10:
        result = "X"
    
    if str(self.id[-1]).upper() == result or int(self.id[-1]) == result:
        return True
    else:
        return False

结语

最后附上Python版本的简单身份证校验、基础信息读取,以及最全的中国行政区划代码字典

Last modification:April 30, 2020
如果觉得我的文章对你有用,请随意赞赏