籍贯的地址信息我这没有 所以就直接输出身份证前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()
省市文件较大,你自主上百度云下载把,地址如下:
链接: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