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