您的位置:

Python实现身份证号码校验方法

一、身份证号码的构成与校验规则

身份证号码是由17位数字和1位校验码组成的。其中,前6位是行政区划代码,第7至14位是年、月、日信息,第15至17位是顺序码,第18位是校验码。校验码的计算采用ISO 7064:1983,MOD 11-2的校验方法。具体计算过程如下:

def validate_ID_number(id_number):
    """
    验证身份证号码是否合法
    """
    # 校验码字符集
    check_code_list = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
    # 身份证号码共18位
    if len(id_number) != 18:
        return False
    # 前17位必须都是数字
    if not id_number[:17].isdigit():
        return False
    # 校验码计算
    check_sum = sum([int(id_number[i]) * (2**(17-i)) for i in range(17)])
    check_code = check_code_list[check_sum % 11]
    # 比较校验码
    if check_code != id_number[-1]:
        return False
    return True

二、身份证号码的行政区划代码

身份证号码的前6位是行政区划代码。根据行政区划代码规定,前两位代表省份、直辖市或自治区,第三至四位代表地级市或自治州,第五至六位代表区、县、县级市。行政区划代码可以用来判断身份证号码所属地区。

def get_province(id_number):
    """
    获取身份证号码所属省份
    """
    province_code = id_number[:2]
    return province_dict.get(province_code, '未知')

def get_city(id_number):
    """
    获取身份证号码所属城市
    """
    city_code = id_number[2:4]
    return city_dict.get(city_code, '未知')

def get_area(id_number):
    """
    获取身份证号码所属区县
    """
    area_code = id_number[4:6]
    return area_dict.get(area_code, '未知')

三、身份证号码的年龄、性别和出生日期

根据身份证号码的第7至14位可以获取出生年月日信息,用当前日期与身份证号码中的出生日期进行相减,即可得到身份证持有人的年龄。其中,出生日期的解析需要用到datetime模块。

import datetime

def get_age(id_number):
    """
    获取身份证号码持有人的年龄
    """
    birth_date = datetime.datetime.strptime(id_number[6:14], '%Y%m%d')
    age = (datetime.datetime.now() - birth_date).days // 365
    return age

def get_gender(id_number):
    """
    获取身份证号码持有人的性别
    """
    gender_code = id_number[-2]
    if int(gender_code) % 2 == 0:
        return '女'
    else:
        return '男'

def get_birthday(id_number):
    """
    获取身份证号码持有人的出生日期
    """
    return id_number[6:14]

四、身份证号码的使用场景

身份证号码是我国公民的唯一身份标识。在日常生活中,身份证号码经常被用于以下场景:

  • 银行开户:银行在开户时需要核对身份证号码信息。
  • 旅游出行:购买机票或火车票时需要提供身份证号码。
  • 医疗就诊:就医时需要出示身份证号码。
  • 政务办理:政务机关办理公务时需要核对身份证号码信息。

五、代码示例

# 省份代码与省份名称映射关系
province_dict = {
    '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': '澳门特别行政区'
}

# 城市代码与城市名称映射关系
city_dict = {...}

# 区县代码与区县名称映射关系
area_dict = {...}

def validate_ID_number(id_number):
    """
    验证身份证号码是否合法
    """
    # 校验码字符集
    check_code_list = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
    # 身份证号码共18位
    if len(id_number) != 18:
        return False
    # 前17位必须都是数字
    if not id_number[:17].isdigit():
        return False
    # 校验码计算
    check_sum = sum([int(id_number[i]) * (2**(17-i)) for i in range(17)])
    check_code = check_code_list[check_sum % 11]
    # 比较校验码
    if check_code != id_number[-1]:
        return False
    return True

def get_province(id_number):
    """
    获取身份证号码所属省份
    """
    province_code = id_number[:2]
    return province_dict.get(province_code, '未知')

def get_city(id_number):
    """
    获取身份证号码所属城市
    """
    city_code = id_number[2:4]
    return city_dict.get(city_code, '未知')

def get_area(id_number):
    """
    获取身份证号码所属区县
    """
    area_code = id_number[4:6]
    return area_dict.get(area_code, '未知')

import datetime

def get_age(id_number):
    """
    获取身份证号码持有人的年龄
    """
    birth_date = datetime.datetime.strptime(id_number[6:14], '%Y%m%d')
    age = (datetime.datetime.now() - birth_date).days // 365
    return age

def get_gender(id_number):
    """
    获取身份证号码持有人的性别
    """
    gender_code = id_number[-2]
    if int(gender_code) % 2 == 0:
        return '女'
    else:
        return '男'

def get_birthday(id_number):
    """
    获取身份证号码持有人的出生日期
    """
    return id_number[6:14]