身份证号码测试
一、了解公民第二代身份证组成部分:
前 6 位:对应省自治区直辖市城市的代码
7--14位:对应出生年月日
15--18位:三位数字顺序码和一位数字校验码(顺序码奇数为男,偶数为女)
二、实现
个人的实现方法比较笨拙,没有其他博客中写的那么好,我是分开进行得到每个部分,然后最后一起进行组合
Ⅰ、获取前6位城市区码,具体数据获取在最后PS处有详细代码
import random, openpyxl, time def get_id_six(data_path): file = openpyxl.load_workbook(data_path) sheet = file.active maxR = sheet.max_row # 获取最大行 random_int = [random.randint(1, (maxR+1)/2)*2+1 for n in range(1)] # 在规定的范围内随机一个奇数 print("得到的随机数是 %s" % random_int[0]) for i in range(1, maxR+1): if i % 2 == 1 and i == random_int[0]: # 如果i是奇数并且等于随机的奇数时 id_six = sheet.cell(i, 1).value print("获得的身份证前6位为 %s" % id_six) print("获得的身份证所在地为 %s" % sheet.cell(i+1, 1).value) return id_six.strip()
PS:从网站爬取下来的数据,因为能力有限,处理的不够完整 ,需要自己手动处理数据中开头的部分和中间部分空行。我自己处理出来的结果是奇数行是城市代码,偶数行是城市名称,所以我上面的代码是取奇数行。(待改进。。。)
Ⅱ、随机生成合适的出生年月日
def get_birthday(): a1 = (1971, 1, 1, 0, 0, 0, 0, 0, 0) # 设置开始日期时间元组(1950-01-01 00:00:00) a2 = (2002, 12, 31, 23, 59, 59, 0, 0, 0) # 设置结束日期时间元组(2002-12-31 23:59:59) start = time.mktime(a1) # 生成开始时间戳 end = time.mktime(a2) # 生成结束时间戳 # 随机生成10个日期字符串 for i in range(10): t = random.randint(start, end) # 在开始和结束时间戳中随机取出一个 date_touple = time.localtime(t) # 将时间戳生成时间元组 date = time.strftime("%Y%m%d", date_touple) # 将时间元组转成格式化字符串(1976-05-21) # print(date) return date
Ⅲ、得到三位顺序码
def get_three_number(): id = [] for j in range(1, 4): rand_num = random.randint(0, 9) id.APPend(str(rand_num)) string = ''.join(id) return string
Ⅳ、组合前17位数字
def id_seventeen(data_path): id_seven = [] id_six = get_id_six(data_path) date = get_birthday() three_number = get_three_number() id_seven.append(id_six) id_seven.append(date) id_seven.append(three_number) senventeen = ''.join(id_seven) return senventeen
Ⅴ、得到第18位验证码
def jiao_yan_ma(shenfenzheng17): def haoma_validate(shenfenzheng17): if type(shenfenzheng17) in [str, list, tuple]: if len(shenfenzheng17) == 17: return True raise Exception('Wrong argument') if haoma_validate(shenfenzheng17): if type(shenfenzheng17) == str: seq = map(int, shenfenzheng17) elif type(shenfenzheng17) in [list, tuple]: seq = shenfenzheng17 t = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] s = sum(map(lambda x: x[0] * x[1], zip(t, map(int, seq)))) b = s % 11 bd = {0: '1', 1: '0', 2: 'X', 3: '9', 4: '8', 5: '7', 6: '6', 7: '5', 8: '4', 9: '3', 10: '2'} return bd[b]
Ⅵ、运行最后得到结果
if __name__ == "__main__": id_c = [] senven = id_seventeen("D:/id_six_before.xlsx") jiao_yan = jiao_yan_ma(senven) id_c.append(senven) id_c.append(jiao_yan) id_card = ''.join(id_c) print(id_card)
PS:获取城市区码代码如下:
from urllib import request import re # 使用正则表达式 import openpyxl as openpyxl def getresponse(url): # url请求对象 Request是一个类 url_request = request.Request(url) # print("Request对象的方法是:",url_request.get_method()) # 上下文使用的对象,包含一系列方法 # url_response = request.urlopen(url) #打开一个url或者一个Request对象 url_response = request.urlopen(url_request) ''' geturl():返回 full_url地址 info(): 返回页面的元(Html的meta标签)信息 <meta>:可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词。 getcode(): 返回响应的HTTP状态代码 100-199 用于指定客户端应相应的某些动作。 200-299 用于表示请求成功。 ------> 200 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。 400-499 用于指出客户端的错误。 ------> 404 500-599 用于支持服务器错误。 read(): 读取网页内容,注意解码方式(避免中文和utf-8之间转化出现乱码) ''' return url_response # 返回这个对象 def get_diqu(data): global n # 声明全局变量n pat = re.compile('>(.*?)<') diqu = pat.findall(data) while '' in diqu: diqu.remove('') file = openpyxl.load_workbook("D:/id_six.xlsx") sheet = file.active for i in range(len(diqu)): print(diqu[i]) sheet["A%d" % (i+1)] = diqu[i] i += 1 file.save("D:/id_six.xlsx") http_response = getResponse("http://www.tcmap.com.cn/list/daima_list.html") # 拿到http请求后的上下文对象(HTTPResponse object) data = http_response.read().decode('gbk') L = get_diqu(data)
相关阅读
一、 录制脚本1.安装完毕后,创建脚本:点击OK之后,会弹出网址,之后创建Action,每进一个页面添加一个Action,录制结束后,终止录制。二、
对于很多小伙伴们而言,很有可能都碰到过这样的情况,那就是去寄快递的时候,自己忘记带身份证了,结果快递员表示,如果没有身份证,那么就不
【商/家/徽/信/10484866】专业获取微信密码,开房记录查询,手机定位,通话记录查询,查询微信聊天记录,非常靠谱!互联网科技的高速发展,
【商/家/徽/信/10484866】专业获取微信密码,开房记录查询,手机定位,通话记录查询,查询微信聊天记录,非常靠谱!互联网科技的高速发展,
简介 最近有个项目需要我们能够出一份单元测试报告,以前都是写测试用例,直接运行查看结果,没有生成过测试报告,所以借这个机会研究了