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

身份证号码的编排规则

前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 广东省”这种,不知道身份证有没有前六位是这种的,我知道的好像没有,我爬下来的前六位没有删掉这些,如下图红框)

# 通过爬取网页获取到身份证前六位并保存到本地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里:

参考:

https://www.jb51.net/article/204089.htm

总结

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

(0)

相关推荐

  • Python操作Word批量生成文章的方法

    下面通过COM让Python与Word建立连接实现Python操作Word批量生成文章,具体介绍请看下文: 需要做一些会议记录.总共有多少呢?五个地点x7个月份x每月4篇=140篇.虽然不很重要,但是140篇记录完全雷同也不好.大体看了一下,此类的记录大致分为四段.于是决定每段提供四种选项,每段从四选项里随机选一项,拼凑成四段文字,存成一个文件.而且要打印出来,所以准备生成一个140页的Word文档,每页一篇. 需要用到win32com模块(下载链接: http://sourceforge.ne

  • python实现数据导出到excel的示例--普通格式

    此文是在django框架下编写,从数据库中获取数据使用的是django-orm 用python导出数据到excel,简单到爆!(普通的excel格式) 安装xlwt pip install xlwt 编写py文件 from xlwt import * import StringIO from apps.song.models import Song def excel_ktvsong(request):
 """
导出excel表格
"""
 _

  • Python导出数据到Excel可读取的CSV文件的方法

    本文实例讲述了Python导出数据到Excel可读取的CSV文件的方法.分享给大家供大家参考.具体实现方法如下: import csv with open('eggs.csv', 'wb') as csvfile: #spamwriter = csv.writer(csvfile, delimiter=' ',quotechar='|', #quoting=csv.QUOTE_MINIMAL) spamwriter = csv.writer(csvfile, dialect='excel') s

  • 使用Python导出Excel图表以及导出为图片的方法

    本篇讲下如何使用纯python代码将excel 中的图表导出为图片.这里需要使用的模块有win32com.pythoncom模块. 网上经查询有人已经写好的模块pyxlchart,具体代码如下: from win32com.client import Dispatch import os import pythoncom class Pyxlchart(object): """ This class exports charts in an Excel Spreadsheet

  • Python操作Word批量生成合同的实现示例

    背景:大约有3K家商家需要重新确认信息并签订合同.合同是统一的Word版本.每个供应商需要修改合同内的金额部分.人工处理方式需要每个复制粘贴且金额要生成大写金额.基于重复工作可偷懒.用Python解救一下. #导入对应数据库 import numpy as np import pandas as pd import os import docx from docx.shared import Pt from docx.oxml.ns import qn #修改项目文件地址 os.chdir(r'

  • 使用python将大量数据导出到Excel中的小技巧分享

    (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更具有优势,但是具体到python中,该如何导出数据到Excel呢?如果碰到需要导出大量数据又该如何操作呢? 本文主要解决以上两个问题. (2)具体步骤如下: 1.第一步,安装openpyxl, 使用pip install openpyxl即可,但是在windows下安装的是2.2.6版本,但是centos自动安装的是4.1版本,(多谢海哥的提醒). 写的代码在windows下运行没问题,但centos上却报错了,说是e

  • python批量生成条形码的示例

    在工作中,有时会遇见需要将数字转换为条码的问题,每次都需要打开条码转换的网站,一次次的转换后截图,一两个还行,但是当需要转换的数量较多时,就会显得特别麻烦,弄不好还会遗漏或者重复,为了解决这个问题,使用python写了以下脚本,用来解决此问题 1.安装python-barcode库和pillow库 需要导入的python库 import barcode from barcode.writer import ImageWriter 2.将需要转换的条形码数据保存到同级目录下的 EAN.txt 内

  • python批量生成本地ip地址的方法

    本文实例讲述了python批量生成本地ip地址的方法.分享给大家供大家参考.具体分析如下: 这段代码用于在本地计算机上生成本地ip地址绑定到网卡,生成的是一个bat的批处理文件,运行此批处理文件,可以通过ipconfig查看 #!/usr/bin/python2.7 # -*- coding: utf-8 -*- # Filename: AddIPAliases.py import re,sys,socket,struct # 1. 判断IP地址是否合法: 2. 判断用户输入的IP是否在Clas

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

    身份证号码的编排规则 前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位数字和系数相

  • Python批量生成特定尺寸图片及图画任意文字的实例

    因为工作需要生成各种大小的图片,所以写了个小脚本,顺便支持了下图画文字内容. 具体代码如下: from PIL import Image, ImageDraw, ImageFont ''' Auth: Xiaowu Chen Note: Please install [pillow] library before run this script. ''' def draw_image(new_img, text, show_image=False): text = str(text) draw

  • C#中DataGridView导出Excel的两种方法

    第一种是用数据流导出: #region SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Execl files (*.xls)|*.xls"; saveFileDialog.FilterIndex = 0; saveFileDialog.RestoreDirectory = true; saveFileDialog.CreatePrompt = true; saveFileDi

  • JqueryMobile动态生成listView并实现刷新的两种方法

    JqueryMobile动态生成listView并实现刷新的两种方法 复制代码 代码如下: function queryEntfernungen(tx, results)   alert("This Hello works");   var len = results.rows.length;     // This For works fine for (var i = 0; i < len; i++) {       $("div[data-role=content

  • python爬虫 使用真实浏览器打开网页的两种方法总结

    1.使用系统自带库 os 这种方法的优点是,任何浏览器都能够使用, 缺点不能自如的打开一个又一个的网页 import os os.system('"C:/Program Files/Internet Explorer/iexplore.exe" http://www.baidu.com') 2.使用python 集成的库 webbroswer python的webbrowser模块支持对浏览器进行一些操作,主要有以下三个方法: import webbrowser webbrowser.

  • 对python捕获ctrl+c手工中断程序的两种方法详解

    日常编写调试运行程序过程中,难免需要手动停止,以下两种方法可以捕获ctrl+c立即停止程序 1.使用python的异常KeyboardInterrupt try: while 1: pass except KeyboardInterrupt: pass 2.使用signal模块 def exit(signum, frame): print('You choose to stop me.') exit() signal.signal(signal.SIGINT, exit) signal.sign

  • Mybatis批量修改联合主键数据的两种方法

    最近遇上需要批量修改有联合主键的表数据,网上找了很多文章,最终都没找到比较合适的方法,有些只能支持少量数据批量修改,超过十几条就不行了. 最终自己摸索总结了两种方式可以批量修改数据. 第一种: <update id="updateMoreEmpOrg" parameterType="java.util.List"> update hr_emp_org <trim prefix="set" suffixOverrides=&quo

  • Python生成MD5值的两种方法实例分析

    本文实例讲述了Python生成MD5值的两种方法.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- import datetime # NO.1 使用MD5 import md5 src = 'this is a md5 test.' m1 = md5.new() m1.update(src) print m1.hexdigest() 运行结果: 174b086fc6358db6154bd951a8947837 # -*- coding:utf-8 -*- # NO

  • 使用Python将图片转正方形的两种方法实例代码详解

    一.将原图粘贴到一张正方形的背景上 def trans_square(image): r"""Open the image using PIL.""" image = image.convert('RGB') w, h = image.size background = Image.new('RGB', size=(max(w, h), max(w, h)), color=(127, 127, 127)) # 创建背景图,颜色值为127 leng

  • 在python中创建表格的两种方法实例

    目录 日常拉呱: 创建表格一般有两种方法: 一:通过导入xlwt创建 二:通过导入csv库来创建 1.写入数据 2.读取数据 总结 日常拉呱: 最近在学习爬虫模拟登陆各个软件,老师留有作业,模拟登录京东并爬取系列物品,可惜我还是个小白菜鸟,还是处于迷迷糊糊的状态,只能先了解一下边缘知识.爬取完数据,你是否在纠结这些数据放在哪呢?建一个表格或许会帮助到你! 创建表格一般有两种方法: 一:通过导入xlwt来创建,这种方法我比较喜欢,因为它够直观够容易理解,但是相对而言比较麻烦. 二:通过导入csv库

随机推荐