Python通过身份证号获取信息

引言

有个需求需要通过身份证号去获取一些用户信息,包括出生地(省、市、区),性别,生日,年龄,生肖,星座等,因此写了个通用的接口,下面分享下方法。这里是Python写的,原理都差不多。

二代身份证号由18位组成
(1) 前1、2位数字表示:所在省(直辖市、自治区)的代码;
(2) 第3、4位数字表示:所在地级市(自治州)的代码;
(3) 第5、6位数字表示:所在区(县、自治县、县级市)的代码;
(4) 第7 – 14位数字表示:出生年、月、日;
(5) 第15、16位数字表示:所在地的派出所的代码;
(6) 第17位数字表示性别:奇数表示男性,偶数表示女性;
(7) 第18位数字是校检码:校检码可以是0-9的数字,或X表示。

实现

截取位数

id_addr = id_number[0:6]
id_birth = id_number[6:14]
id_sex = id_number[16:17]

获取性别

sex = 2 if int(id_sex) % 2 == 0 else 1
sex_desc = '女' if sex == 2 else '男'

获取生日

year = id_birth[0:4]
month = id_birth[4:6]
day = id_birth[6:8]
birth = '{}-{}-{}'.format(year, month, day)

获取年龄

写了个通用方法,支持多种格式的日期。

def get_age(birthday):
    """
    获取年龄
    :param birthday: 出生日期 yyyymmdd / yyyy-mm-dd / yyyy年mm月dd日
    :return: 年龄
    """
    birthday = str(birthday).replace('-', '').replace('年', '').replace('月', '').replace('日', '')
    if len(birthday) != 8:
        return False
    today = str(datetime.datetime.now().strftime('%Y-%m-%d')).split("-")
    today_m_d = today[1] + today[2]
    today_y = today[0]
    birth_m_d = birthday[4:]
    birth_y = birthday[:4]
    if int(today_m_d) >= int(birth_m_d):
        age = int(today_y) - int(birth_y)
    else:
        age = int(today_y) - int(birth_y) - 1
    return age

获取生肖

def get_zodiac(year):
    """
    获取生肖
    :param year: 年
    :return: 生肖
    """
    animals = '猴鸡狗猪鼠牛虎兔龙蛇马羊'
    zodiac = animals[int(year) % 12]
    return zodiac

获取星座

def get_constellation(month, day):
    """
    获取星座
    :param month: 月
    :param day: 日
    :return: 星座
    """
    con_dict = ('摩羯座', '水瓶座', '双鱼座', '白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座', '天秤座', '天蝎座', '射手座')
    con_day = ((1, 20), (2, 19), (3, 21), (4, 21), (5, 21), (6, 22), (7, 23), (8, 23), (9, 23), (10, 23), (11, 23), (12, 23))
    constellation = con_dict[len(list(filter(lambda y: y < (int(month), int(day)), con_day))) % 12]
    return constellation

地区字典

地区字典从网上找的,大概校对了下。 此处只放了省份的,全放会导致很卡,如需全部请查看

province = {
    "11": "北京市",
    "12": "天津市",
    "13": "河北省",
    "14": "山西省",
    "15": "内蒙古自治区",
    "21": "辽宁省",
    "22": "吉林省",
    "23": "黑龙江省",
    "31": "上海市",
    "32": "江苏省",
    "33": "浙江省",
    "34": "安徽省",
    "35": "福建省",
    "36": "江西省",
    "37": "山东省",
    "41": "河南省",
    "42": "湖北省",
    "43": "湖南省",
    "44": "广东省",
    "45": "广西壮族自治区",
    "46": "海南省",
    "50": "重庆市",
    "51": "四川省",
    "52": "贵州省",
    "53": "云南省",
    "54": "西藏自治区",
    "61": "陕西省",
    "62": "甘肃省",
    "63": "青海省",
    "64": "宁夏回族自治区",
    "65": "新疆维吾尔自治区",
    "71": "台湾省",
    "81": "香港特别行政区",
    "82": "澳门特别行政区"
}

获取地区

def get_province(code):
    """
    获取省
    :param code: 地区码
    :return: 省
    """
    if len(code) < 2:
        return ''
    p_code = str(code)[:2]
    return province[p_code] if p_code in province else ''

def get_city(code):
    """
    获取市
    :param code: 地区码
    :return: 市
    """
    if len(code) < 4:
        return ''
    c_code = str(code)[:4]
    return city[c_code] if c_code in city else ''

def get_area(code):
    """
    获取县区
    :param code: 地区码
    :return: 县区
    """
    if len(code) < 6:
        return ''
    a_code = str(code)[:6]
    return area[a_code] if a_code in area else ''

p_res = get_province(id_addr)
c_res = get_city(id_addr)
a_res = get_area(id_addr)
addr = '{}{}{}'.format(p_res, c_res if c_res != p_res else '', a_res if a_res != c_res else '')

返回结果

result = {
    'Sex': sex,
    'SexDesc': sex_desc,
    'Birthday': birth,
    'Age': get_age(birth),
    'Zodiac': get_zodiac(year),
    'Constellation': get_constellation(month, day),
    'Province': p_res,
    'City': c_res,
    'Area': a_res,
    'Address': addr,
}

主要核心代码就是以上。

演示

暂无评论

发送评论 编辑评论


				
上一篇
下一篇