python批量生成身份证号到Excel的两种方法实例


Posted in Python onJanuary 14, 2021

身份证号码的编排规则

前1、2位数字表示:所在省份的代码;

第3、4位数字表示:所在城市的代码;

第5、6位数字表示:所在区县的代码;

第7~14位数字表示:出生年、月、日;

第15、16位数字表示:所在地的派出所的代码;

第17位数字表示性别:奇数表示男性,偶数表示女性;

第18位数字是校检码,计算方法如下:

(1)将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。

(2)将这17位数字和系数相乘的结果相加。

(3)用加出来和除以11,取余数。

(4)余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。(即余数0对应1,余数1对应0,余数2对应X…)

第一种方法:网页爬取身份证前六位

import urllib.request
from bs4 import BeautifulSoup
import re
import random
import time
import xlwt

# 通过爬取网页获取到身份证前六位
url = 'http://www.qucha.net/shenfenzheng/city.htm'
headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36'
}
request = urllib.request.Request(url, headers=headers) # 获取url的网页源码
response = urllib.request.urlopen(request)
html = response.read()
soup = BeautifulSoup(html, 'lxml')
strarr = []
for info in soup.find_all('td', valign='top'): # <td valign = "top"></td>中的内容
 pattern = re.compile(r'\d{6}') # 正则表达式,找6个整数
 pre = re.findall(pattern, info.text) # 在info中查找符合表达式的内容

def year():
 '''生成年份'''
 # 从1960开始算,now-18直接过滤掉小于18岁出生的年份
 now = time.strftime('%Y')
 second = random.randint(1960, int(now) - 18)
 return second


def month():
 '''生成月份'''
 three = str(random.randint(1, 12))
 mon = three.zfill(2)# zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0
 return mon


def day(year, month):
 '''生成日期'''
 four = str(getDay(year, month))
 days = four.zfill(2)
 return days


def getDay(year, month):
 '''根据传来的年月份返回日期'''
 # 1,3,5,7,8,10,12月为31天,4,6,9,11为30天,2月闰年为28天,其余为29天
 aday = 0
 if month in (1, 3, 5, 7, 8, 10, 12):
 aday = random.randint(1, 31)
 elif month in (4, 6, 9, 11):
 aday = random.randint(1, 30)
 else:
 # 即为2月判断是否为闰年
 if ((year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)):
 aday = random.randint(1, 28)
 else:
 aday = random.randint(1, 29)
 return aday


def randoms():
 '''生成身份证后三位'''
 ran = str(random.randint(1, 999))
 five = ran.zfill(3)
 return five


# 前17位身份证
def ID():
 first = random.choice(pre)
 second = year()
 three = month()
 four = day(second, three)
 five = randoms()
 # 前17位身份证
 ID = str(first) + str(second) + three + four + five
 return ID

def ID_last():
 ID_17 = ID()
 lid = list(map(int, ID_17)) # 将字符串数组转为int列表
 weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] # 权重项
 temp = 0
 for i in range(17):
 temp += lid[i]*weight[i]
 checkcode = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']# 校验码映射
 ID_last = checkcode[temp%11]
 return ID_last

# 创建一个workbook 设置编码
workbook = xlwt.Workbook(encoding='utf-8')
# 创建一个worksheet
worksheet = workbook.add_sheet('IDcard')
# 设置单元格宽度
worksheet.col(0).width = 5555

for i in range(100): #设置生成身份证号的数量
 IDcard = ID() + ID_last()
 worksheet.write(i, 0, IDcard)
 # 写入excel,参数对应 行, 列, 值
workbook.save('IDcard.xlsx')
# 运行后 会在当前目录生成一个IDcard.xlsx

第二种方法:身份证前六位从本地excel中取

如果自己有这么一份全国身份证前六位的数据且存在excel中,可以直接跳到第二步。没有的话,下面是爬取全国身份证前六位,并保存到自己本地的代码实现,建议跑一遍保存下来,谁知道这个爬取的地址哪天作者删除文件了呢,到时第一种方法就不适用了,得换地址处理等。(另外,爬取下来到excel中自己还能再处理一下前六位,因为我这个爬取包括“440000 广东省”这种,不知道身份证有没有前六位是这种的,我知道的好像没有,我爬下来的前六位没有删掉这些,如下图红框)

python批量生成身份证号到Excel的两种方法实例

# 通过爬取网页获取到身份证前六位并保存到本地excel中
import urllib.request
from bs4 import BeautifulSoup
import re
import xlwt

# 通过爬取网页获取到身份证前六位
url = 'http://www.qucha.net/shenfenzheng/city.htm'
headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36'
}
request = urllib.request.Request(url, headers=headers) # 获取url的网页源码
response = urllib.request.urlopen(request)
html = response.read()
soup = BeautifulSoup(html, 'lxml')
strarr = []
for info in soup.find_all('td', valign='top'): # <td valign = "top"></td>中的内容
 pattern = re.compile(r'\d{6}') # 正则表达式,找6个整数
 pre = re.findall(pattern, info.text) # 在info中查找符合表达式的内容,保存在pre中

# 创建一个workbook 设置编码
workbook = xlwt.Workbook(encoding='utf-8')
# 创建一个worksheet
worksheet = workbook.add_sheet('ID_pre_six')
# 设置单元格宽度
worksheet.col(0).width = 3333

for i in range(len(pre)):
 worksheet.write(i, 0, pre[i])
 # 写入excel,参数对应 行, 列, 值
workbook.save('ID_pre_six.xlsx')
# 运行后 会在当前目录生成一个ID_pre_six.xlsx

导入本地excel数据(身份证前六位)保存为字符串数组,然后生成身份证号码

import random
import time
import xlwt
import pandas as pd

# 不把第1行作为列名,读取Excel那就没有列名,需增加参数:header=None
# 第一个参数为身份证前六位的excel数据路径
df = pd.read_excel('E:\Code\Python\ID_pre_six.xlsx', sheet_name='ID_pre_six', header=None)
# 获取最大行
nrows = df.shape[0]
pre = []
for iRow in range(nrows):
 # 将表中第一列数据写入pre数组中
 pre.append(df.iloc[iRow, 0])

def year():
 '''生成年份'''
 # 从1960开始算,now-18直接过滤掉小于18岁出生的年份
 now = time.strftime('%Y')
 second = random.randint(1960, int(now) - 18)
 return second


def month():
 '''生成月份'''
 three = str(random.randint(1, 12))
 mon = three.zfill(2)# zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0
 return mon


def day(year, month):
 '''生成日期'''
 four = str(getDay(year, month))
 days = four.zfill(2)
 return days


def getDay(year, month):
 '''根据传来的年月份返回日期'''
 # 1,3,5,7,8,10,12月为31天,4,6,9,11为30天,2月闰年为28天,其余为29天
 aday = 0
 if month in (1, 3, 5, 7, 8, 10, 12):
 aday = random.randint(1, 31)
 elif month in (4, 6, 9, 11):
 aday = random.randint(1, 30)
 else:
 # 即为2月判断是否为闰年
 if ((year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)):
 aday = random.randint(1, 28)
 else:
 aday = random.randint(1, 29)
 return aday


def randoms():
 '''生成身份证后三位'''
 ran = str(random.randint(1, 999))
 five = ran.zfill(3)
 return five


# 前17位身份证
def ID():
 first = random.choice(pre)
 second = year()
 three = month()
 four = day(second, three)
 five = randoms()
 # 前17位身份证
 ID = str(first) + str(second) + three + four + five
 return ID

def ID_last():
 ID_17 = ID()
 lid = list(map(int, ID_17)) # 将字符串数组转为int列表
 weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] # 权重项
 temp = 0
 for i in range(17):
 temp += lid[i]*weight[i]
 checkcode = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']# 校验码映射
 ID_last = checkcode[temp%11]
 return ID_last

# 创建一个workbook 设置编码
workbook = xlwt.Workbook(encoding='utf-8')
# 创建一个worksheet
worksheet = workbook.add_sheet('IDcard')
# 设置单元格宽度
worksheet.col(0).width = 5555

for i in range(100):# 设置生成数量
 IDcard = ID() + ID_last()
 worksheet.write(i, 0, IDcard)
 # 写入excel,参数对应 行, 列, 值
workbook.save('IDcard.xlsx')
# 运行后 会在当前目录生成一个IDcard.xlsx

PS:爬取网页中哪个tag里的内容,可以浏览器页面,右键->查看网页源代码,如下图,我需要的内容都含在方框那个tag里:

python批量生成身份证号到Excel的两种方法实例

参考:

总结

到此这篇关于python批量生成身份证号到Excel的两种方法的文章就介绍到这了,更多相关python批量生成身份证号到Excel内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
对于Python中RawString的理解介绍
Jul 07 Python
Python基于time模块求程序运行时间的方法
Sep 18 Python
python实现list由于numpy array的转换
Apr 04 Python
Centos 升级到python3后pip 无法使用的解决方法
Jun 12 Python
一百多行python代码实现抢票助手
Sep 25 Python
Python3 itchat实现微信定时发送群消息的实例代码
Jul 12 Python
django xadmin中form_layout添加字段显示方式
Mar 30 Python
django迁移文件migrations的实现
Mar 31 Python
python中如何写类
Jun 29 Python
详解pycharm2020.1.1专业版安装指南(推荐)
Aug 07 Python
如何把python项目部署到linux服务器
Aug 26 Python
MoviePy常用剪辑类及Python视频剪辑自动化
Dec 18 Python
Django扫码抽奖平台的配置过程详解
Jan 14 #Python
如何用python实现一个HTTP连接池
Jan 14 #Python
如何用python写个模板引擎
Jan 14 #Python
opencv python 对指针仪表读数识别的两种方式
Jan 14 #Python
详解如何使用Pytest进行自动化测试
Jan 14 #Python
matplotlib对象拾取事件处理的实现
Jan 14 #Python
用python查找统一局域网下ip对应的mac地址
Jan 13 #Python
You might like
php auth_http类库进行身份效验
2009/03/19 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
谈谈关于php的优点与缺点
2013/04/11 PHP
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
测试php函数的方法
2013/11/13 PHP
PHP小技巧之函数重载
2014/06/02 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
YII框架页面缓存操作示例
2019/04/29 PHP
js子页面获取父页面数据示例
2014/05/15 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
jquery dialog获取焦点的方法
2017/02/09 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
2018/05/31 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
js运算符的一些特殊用法
2018/07/29 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
Echarts实现单条折线可拖拽效果
2019/12/19 Javascript
微信小程序实现点赞业务
2021/02/10 Javascript
Python爬取qq空间说说的实例代码
2018/08/17 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
2019/09/29 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
Keras之fit_generator与train_on_batch用法
2020/06/17 Python
Python连接Mysql进行增删改查的示例代码
2020/08/03 Python
python接口自动化框架实战
2020/12/23 Python
HTML5 Canvas的常用线条属性值总结
2016/03/17 HTML / CSS
便利店的创业计划书
2014/01/15 职场文书
业务部门经理岗位职责
2014/02/23 职场文书
工会趣味活动方案
2014/08/18 职场文书
医学检验专业自荐信
2014/09/18 职场文书
家长会主持词开场白
2015/05/29 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
python如何读取.mtx文件
2021/04/22 Python
Win7/8.1用户可以免费升级到Windows 11系统吗?
2021/11/21 数码科技
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers