Python随机生成身份证号码

作者: Mo丶染洛凉 | 来源:发表于2017-08-02 17:30 被阅读577次

更多教程请移步至:洛凉博客

求助请移步至:Python自学技术交流

今天一个朋友和我聊天说到,昨天去百度面试高级测试工程师。
面试过程中,有被问到Python相关知识。
也提了一个Python相关的问题。
用Python实现随机生成大于18以上的身份证号码。
很遗憾他没有做出来。但是至少也是一次不错的面试经验。
上午我就自己动手试了试。
首先百度了下身份证生成规则。下面大家来一起看一下:
公民身份号码是由17位数字码和1位校验码组成。排列顺序从左至右分别为:6位地址码,8位出生日期码,3位顺序码和1位校验码。
地址码(身份证地址码对照表见下面附录)和出生日期码很好理解,顺序码表示在同一地址码所标识的区域范围内,对同年同月同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
身份证最后一位校验码算法如下:

  1. 将身份证号码前17位数分别乘以不同的系数,从第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这些个数字,其对应的身份证最后一位校验码为1 0 X 9 8 7 6 5 4 3 2。
    身份证号码解密|身份证尾数校验码算法|ID card information
    身份证地址码对照表。

以下代码都是在Python3环境下运行,用Python2的请自行修改再运行。
运行环境:Python3,运行使用的到库:requests,bs4,random,time


这个网站有点过分了,没登录不让复制,我就直接暴力点,把它爬下来了。


身份证生成规则.png
import requests
from bs4 import BeautifulSoup

url = 'http://www.360doc.com/content/12/0917/16/1888675_236595612.shtml'
html = requests.get(url)
html.encoding = 'UTF-8'
soup = BeautifulSoup(html.text,'lxml')
for info in soup.find_all(class_='MsoNormal'):
    print(info.text)

不过大家不要太认真。(我还是比较菜的)
下面是身份证生成代码。
问题:
1:前6位为随便复制了一点地区代码加到列表里面去随机取。
2:年份直接从1948年开始(百度介绍说身份证是从1948年开始实施的,虽然当时好像是15位吧),结束年份为当前本地时间减去18,这样就避免生成的身份证号码上年龄小于18周岁
3:日期我没有去考虑每月的日期长度(例如2月份没有30,31号),我直接以1-31随机
4:后面四位我没有按照规则去生成。

PS:有兴趣的可以完善下,让生成的更加符合规律。

import random
import time


def regiun():
    '''生成身份证前六位'''
    #列表里面的都是一些地区的前六位号码
    first_list = ['362402','362421','362422','362423','362424','362425','362426','362427','362428','362429','362430','362432','110100','110101','110102','110103','110104','110105','110106','110107','110108','110109','110111']
    first = random.choice(first_list)
    return first

def year():
    '''生成年份'''
    now = time.strftime('%Y')
    #1948为第一代身份证执行年份,now-18直接过滤掉小于18岁出生的年份
    second = random.randint(1948,int(now)-18)
    age = int(now) - second
    print('随机生成的身份证人员年龄为:'+str(age))
    return second


def month():
    '''生成月份'''
    three = random.randint(1,12)
    #月份小于10以下,前面加上0填充
    if three < 10:
        three = '0' + str(three)
        return three
    else:
        return three


def day():
    '''生成日期'''
    four = random.randint(1,31)
    #日期小于10以下,前面加上0填充
    if four < 10:
        four = '0' + str(four)
        return four
    else:
        return four


def randoms():
    '''生成身份证后四位'''
    #后面序号低于相应位数,前面加上0填充
    five = random.randint(1,9999)
    if five < 10:
        five = '000' + str(five)
        return five
    elif 10 < five < 100:
        five = '00' + str(five)
        return five
    elif 100 < five < 1000:
        five = '0' + str(five)
        return five
    else:
        return five


def main():
    first = regiun()
    second = year()
    three = month()
    four = day()
    last = randoms()
    IDcard = str(first)+str(second)+str(three)+str(four)+str(last)
    print('随机生成的身份证号码为:'+IDcard)


if __name__ == '__main__':
    main()

随机生成身份证号码.png

相关文章

  • python必知必会6

    Python中生成随机整数、随机小数、0—1之间小数方法 生成随机整数使用random.randint()生成随机...

  • python生成随机数

    python 生成随机数

  • Python随机生成身份证号码

    更多教程请移步至:洛凉博客 求助请移步至:Python自学技术交流 今天一个朋友和我聊天说到,昨天去百度面试高级测...

  • Python常见面试题(二)

    python生成随机函数 random模块 random.random()随机生成0-1之间的数字 random....

  • python的这几个小功能,你都会用了吗?

    python 随机抽取 python 冒泡排序 列出当前目录下所有的文件和目录名 python 生成随机验证码 检...

  • OpenCV:图片操作基本知识(二)

    公众号:大邓带你玩python 1.1随机生成像素 生成与test.jpg相同大小图片,但是像素是随机生成的。 1...

  • Python 标准库:random

    Python 中的 random 模块用于生成各种分布的随机数。random 模块可以生成随机浮点数、整数、字符串...

  • 随机数库

    random库 Python自带了一个random库,该库可以随机生成一些数,常用来生成一个随机实数或者随机整数。...

  • python 批量生成随机字符串的hash值

    python 批量生成随机字符串的hash值 需求 由于测试需要,需产生大量SHA1序列,通过生成随机定长序列,然...

  • Python小函数

    生成随机数 生成指定范围内的浮点数: 参考链接:python生成随机数方法小结 进制转换 二进制到十进制:

网友评论

  • c294d025b87b:你的算法太复杂,建议还是看看维基百科上的算法重新优化下。一个简单的算法还调URL去验证,也是醉了。

    def verify_id_str(s):
    result = 0
    num_list = [10 if ch.lower() == 'x' else int(ch) for ch in s]
    for ii, n in enumerate(num_list):
    i = 18 - ii
    weight = 2 ** (i - 1) % 11
    result = (result + n * weight) % 11
    # print "i=%d,weight=%d,n=%d,sum=%d"%(i,weight,n,sum)
    # print sum
    return result == 1
    Mo丶染洛凉:@SeganW 谢谢指导

本文标题:Python随机生成身份证号码

本文链接:https://www.haomeiwen.com/subject/utrylxtx.html