一、身份证号码的构成与校验规则
身份证号码是由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]