003.生成身份证号

#identity card
#现行身份证号为18位,分别为6位地址码,8位生日,3位顺序码,一位校验码
# 将第i位上的权重值记作Wi,Wi的值为 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
# 将身份证第i位的数字记作Ai
# 则使用下列公式算出一个数S= Sum(Ai*Wi) mod 11 取11的模。
# 这样S的取值如下表(Y就是最终的校验码。):
# 对每一个S做一个映射 Y,这样就有如下的表
# S:0  1  2  3  4  5  6  7  8  9  10
# Y:1  0  X  9  8  7  6  5  4  3  2
from datetime import date
from datetime import timedelta
import random
#随机获取文件districtCode.txt中的一个地区代码,作为身份证的前六位
def getDistrictCode():
    fp = open('districtCode.txt')
    lines = fp.readlines()
    DistrictCode = lines[random.randint(1, 3135)]
    return DistrictCode
def generator():
    DistrictCode = getDistrictCode().rstrip('\n')#地区代码生成后会有\n,所以要先去除
    id = DistrictCode + '1980'#固定年份
    # id = DistrictCode + str(random.randint(1950,2000))#出生年在1950~2000年之间
    # da = date.today() + timedelta(days=random.randint(1, 366))
    # id = id + da.strftime("%m%d")#月份和日期项
    id = id + '0909'#固定月份和日期
    id = id + str(random.randint(100,300))#顺序号简单处理
    # print("id的前17位位:%s"%id)
    count = 0
    weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]  # 权重项
    checkcode = {'0': '1', '1': '0', '2': 'X', '3': '9', '4': '8', '5': '7',
                 '6': '6', '7': '5', '8': '5', '9': '3','10': '2'}  # 校验码映射
    for i in range(0,len(id)):
        count = count + int(id[i])*weight[i]
    id = id + checkcode[str(count%11)]
    print(id)
    return id
if __name__ == '__main__':
    for i in range(0,10):
        generator()

猜你喜欢

转载自blog.csdn.net/baidu_27361307/article/details/80987750