美文网首页
用Python校验身份证号码

用Python校验身份证号码

作者: A04 | 来源:发表于2018-03-29 19:45 被阅读0次

当前我国身份证号码是18位号码,执行标准是GB11643-1999,该标准对身份证号码的每一位的意义,计算方法有详细说明,特别是第18位作为校验位,有特定的算法,按照该算法,编写python代码,可以用于校验身份证号码是否有效。代码如下

# t代表身份证号码的位数,w表示每一位的加权因子
t = []
w = []
for i in range(0,18):
    t1 = i + 1
    t.append(t1)
    w1 = (2 ** (t1-1)) % 11
    w.append(w1)
#队列w要做一个反序
w = w[::-1]  

# 根据前17位的余数,计算第18位校验位的值
def for_check(n):
    # t = 0
    for i in range(0,12):
        if (n + i) % 11 == 1:
            t = i % 11
    if t == 10:
        t = 'X'
    return t
    
# 根据身份证的前17位,求和取余,返回余数
def for_mod(id):
    sum = 0
    for i in range(0,17):
        sum += int(id[i]) * int(w[i])
        # print(int(id[i]),int(w[i]),sum)
    sum = sum % 11
    # print(sum)
    return sum

# 验证身份证有效性
def check_true(id):
    # print(for_check(for_mod(id[:-1])))
    if id[-1] == 'X':
        if for_check(for_mod(id[:-1])) == 'X':
            return True
        else:
            return False
    else:
        if for_check(for_mod(id[:-1])) == int(id[-1]):
            return True
        else:
           return False

有些时候,当你仅知道某人身份证号码的部分号码,有部分号码不知道,例如出生月份、日期4位数字不知道的时候,则可以使用上述代码,遍历所有的月份、日期对应的数字,校验哪个月份、日期对应的身份证号码是有效的

# 获取日期列表,从01到31
day = []
for i in range(0,4):
    for j in range(0,10):
        d = str(i) + str(j)
        day.append(d)
        if d == '31':
            break
    if d == '31':
        break
day = day[1:]

# 获取月份列表,从01到12
month = []
for i in range(0,3):
    for j in range(0,10):
        d = str(i) + str(j)
        month.append(d)
        if d == '12':
            break
    if d == '12':
        break
month = month[1:] 

# 获取年月列表,从0101到1231,剔除不存在的日期
mmdd = []
for i in month:
    for j in day:
        md = i + j
        mmdd.append(md)
mmdd.remove('0230')
mmdd.remove('0231')
mmdd.remove('0431')
mmdd.remove('0631')
mmdd.remove('0931')
mmdd.remove('1131')

#以下代码用于遍历所有日期,打印出通过校验的身份证号码
id1 = '4400011988'
id3 = '0122'
j = 0
for i in mmdd:
    theid = id1 + i + id3
    if check_true(theid):
        print(theid)
        j += 1

上述代码演示一个遍历过程,假如知道身份证号码4400011988****0122,中间有4位数字不知道,则可以使用上述代码遍历出符合校验规则的身份证号码,如下图所示,不过符合要求的号码也有34个,比较多,所以还需要通过其他途径得到确切的身份证号码。

相关文章

网友评论

      本文标题:用Python校验身份证号码

      本文链接:https://www.haomeiwen.com/subject/wqdvcftx.html