有没有帅哥美女们帮我看一下,这个查询身份证的python怎么做,真的不会啊。

img

img


一共给了两个文件,第一个用截图发了,还有个查籍贯的发不出来,具体步骤和方法都说一下呗

籍贯的地址信息我这没有 所以就直接输出身份证前6位了,另外身份证正则匹配可以不用 直接删除就好


import re
# 身份证正则匹配
re_id_code=re.compile(r'^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$')
# 身份证校验码
def check_id_code(id_code):
    weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
    sum = 0
    for i in range(len(id_code)):
        sum += int(id_code[i]) * weight[i]
    return check_code[sum % 11]

while True:
    id_code = input('请输入身份证号码:')
    if check_id_code(id_code[:17]) == id_code[17]:
        print('身份证号码校验成功!')
    else:
        continue
    # 身份证性别
    if int(id_code[16]) % 2 == 0:
        print('性别:女')
    else:
        print('性别:男')
    # 身份证出生日期
    print('生日:{}年{}月{}日'.format(id_code[6:10], id_code[10:12], id_code[12:14]))
    # 身份证地址
    print('地址:{}'.format(id_code[0:6]))

把输入的身份证号分段截取,根据题目描述,取出来的段用于输出信息。
比如第17位,模2==0的话就输出性别女,否则输出性别男;
写一个校验函数,判断校验位是否正确;
把json文件里面的数据读出来,然后把输入的身份证号前6位去里面匹配,找到籍贯地址输出;


 
# _*_coding:utf-8_*_
import re
def validateIdCard(idCard):
    weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
    sum = 0
    for i in range(len(idCard)):
        sum += int(idCard[i]) * weight[i]
    return check_code[sum % 11]
def passIdCard(idCard):
    idCardRegParttern = re.compile('^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$')
    res = re.match(idCardRegParttern, idCard)
    return res != None

def findArea(areaCode):
    # 1. 获取区域情况
    areaList = []
    with open('./area.js', 'rb') as file:
        temp = file.readline()
        while temp:
            areaList.append(temp.decode('utf-8'))
            temp = file.readline()
    # 2. 找地区
    provinceCode = areaCode[0:2]+"0000"
    cityCode = areaCode[0:4]+"00"
    provinceVal = ''
    cityVal = ''
    areaVal = ''
    for item in areaList:
        if item.startswith(provinceCode):
            provinceVal = item.split(",")[1].strip("\n").strip("\r")
        if item.startswith(cityCode):
            cityVal = item.split(",")[1].strip("\n").strip("\r")+'市'
        if item.startswith(areaCode):
            areaVal = item.split(",")[1].strip("\n").strip("\r")
    
    return provinceVal+cityVal+areaVal

def judge(idCard):
    if (validateIdCard(idCard[:17]) == idCard[17]):
        print('校验通过!')
    else:
        print('校验失败!')
        return
    if int(idCard[16]) % 2 == 0:
        print('性别:女')
    else:
        print('性别:男')
    print('生日:{}年{}月{}日'.format(idCard[6:10], idCard[10:12], idCard[12:14]))
    print('籍贯:{}'.format(findArea(idCard[0:6])))

def main():
    # idCard = "230182198012251659"
    # if passIdCard(idCard) == False:
    #     print("fail")
    # else:
    #     judge(idCard)
    while True:
        idCard = input('请输入身份证号码:')
        if passIdCard(idCard) == False:
            print("校验失败!")
        else:
            judge(idCard)

if __name__ == '__main__':
    main()

img

省市文件较大,你自主上百度云下载把,地址如下:
链接:https://pan.baidu.com/s/1KdQJnT_6gdi4HEUKVDgwOQ
提取码:xe9i
--来自百度网盘超级会员V3的分享

python计算身份证校验位

#coding utf-8
 
num = input("请输入1-17位身份证号码:")
xishu = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
qiumo = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
sum = 0
for i in range(17):
    sum += int(num[i])*int(xishu[i])
yu = sum%11
yanzheng = qiumo[yu]
print("验证码为:%s"%yanzheng)
print("身份证号码为:%s%s"%(str(num),str(yanzheng)))

身份证合法性校验

import time
def check_id_length(n):
    if len(str(n)) != 18:
        print("只支持18位身份证号查询")
        return False
    else:
        return True

def check_id_data(n):
    n = str(n)
    n2 = str(n[:16])
    time_now = int(time.strftime("%Y",time.localtime()))
    is_digit = (not(n2.isdigit())) or (not(n[17].isdigit()) and (n[17]) !="x")
    if (is_digit):
        print("对不起,您这是火星身份证,暂不受理")
    elif (int(n[6:10]))>time_now:
            print(n[6:10],"年的人?您是穿越回来吗?")
    elif (int(n[10:12]))>12:
        print(n[10:12],"月出生?,您是捡来的吧!!")
    elif (int(n[12:14]))>31:
        print(n[12:14],"日出生?,您一定是充话费送的")
    else:
        check_id_data2(n)
def check_id_data2(n):
        var=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
        var_id=['1','0','x','9','8','7','6','5','4','3','2']
        sum = 0
        if int(n[16])%2==0:
            gender="女"
            same=int(int(n[16])/2)
        else:
            gender="男"
            same=int((int(n[16])+1)/2)
        for i in range(0,17):
            sum += int(n[i])*var[i]
        sum %= 11
        if (var_id[sum])==str(n[17]):
            print("身份证号规则核验通过,校验码是:",var_id[sum])
            print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性别:",gender,"
当地同性别同生日排名:",same)
            return sum
        else:
            print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性别:",gender,"
当地同性别同生日排名:",same)
            print("但身份证号规则核验失败,校验码应为",var_id[sum],",当前校验码是:",n[17])
            return 0
while(1):
    print("
菜单,请输入数字
----------------------")
    print("输入1手动输入身份证号")
    print("输入2选择测试号")
    print("不然就拜拜")
    print("----------------------")
    select = input("
请输入:")
    if (select.isdigit()):
        pass
    else:
        print("说好的输入数字的呢,拜拜了您嘞")
        break
    select = int(select)
    if (select == 1):
        n = input("请输入18位身份证号:")
        if check_id_length(n):
            check_id_data(n)
        else:
            print("请重新输入")
    elif select == 2:
                 print("
----------------------")
                 print("开始校验身份证号:61011519920317602")
                 check_id_length(61011519920317602)
                 print("
----------------------")
                 print("开始校验身份证号:610115199203176021")
                 check_id_data(610115199203176021)
                 print("
----------------------")
                 print("开始校验身份证号:610115199203176028")
                 check_id_data(610115199203176028)
    else:
                 break