Python身份证号如何编写程序
编写Python程序验证身份证号的核心步骤包括:解析身份证号的结构、校验身份证号的合法性、提取身份证号中的信息。今天我们将详细探讨这些步骤,并提供代码示例来实现每个功能点。
解析身份证号的结构
中国的身份证号是由18位数字组成的,每一部分都有其特定的含义。前6位是地址码,中间8位是出生日期,后4位是顺序码和校验码。理解这些部分非常重要,因为它们不仅决定了身份证号的合法性,还能帮助我们提取有用的信息。
地址码
前6位数字代表了行政区划代码,前三位是省级代码,中间两位是地级代码,最后一位是县级代码。这些代码是固定的,可以通过查阅国家统计局发布的行政区划代码表来获得。
出生日期
第7到14位是出生日期,格式为YYYYMMDD。这个日期需要进行合法性校验,比如是否存在20190230这种不合法的日期。
顺序码
第15到17位是顺序码,用于区分同一天出生的不同人。这个顺序码的最后一位奇数表示男性,偶数表示女性。
校验码
第18位是校验码,用于校验前17位数字的合法性。校验码的计算方法比较复杂,需要使用加权因子和模11算法。
一、解析身份证号的结构
首先,我们需要解析身份证号的各个部分。具体来说,我们需要拆分出地址码、出生日期、顺序码和校验码。
def parse_id_number(id_number):
# 地址码
address_code = id_number[:6]
# 出生日期
birth_date = id_number[6:14]
# 顺序码
order_code = id_number[14:17]
# 校验码
check_code = id_number[17]
return address_code, birth_date, order_code, check_code
id_number = "11010519491231002X"
address_code, birth_date, order_code, check_code = parse_id_number(id_number)
print("地址码:", address_code)
print("出生日期:", birth_date)
print("顺序码:", order_code)
print("校验码:", check_code)
在这个代码片段中,我们定义了一个函数parse_id_number
来解析身份证号,并输出各个部分的值。这个函数非常基础,但它为后续的校验和信息提取打下了基础。
二、校验身份证号的合法性
校验身份证号的合法性是非常重要的一步。我们需要检查地址码、出生日期和校验码的合法性。
校验地址码
地址码的校验需要查阅行政区划代码表。我们可以将这些代码存储在一个字典中,然后进行查找。
# 假设我们有一个字典存储了所有的行政区划代码
address_code_dict = {
"110000": "北京市",
"110100": "北京市市辖区",
"110101": "北京市东城区",
# ... 其他代码
}
def validate_address_code(address_code):
return address_code in address_code_dict
print("地址码合法性:", validate_address_code(address_code))
校验出生日期
出生日期的校验需要使用Python的日期处理库,比如datetime
模块。
from datetime import datetime
def validate_birth_date(birth_date):
try:
datetime.strptime(birth_date, "%Y%m%d")
return True
except ValueError:
return False
print("出生日期合法性:", validate_birth_date(birth_date))
校验顺序码
顺序码的校验比较简单,只需要确保它是一个三位的数字即可。
def validate_order_code(order_code):
return order_code.isdigit() and len(order_code) == 3
print("顺序码合法性:", validate_order_code(order_code))
校验校验码
校验码的计算比较复杂,需要使用加权因子和模11算法。
def calculate_check_code(id_number):
weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check_codes = "10X98765432"
total_sum = sum(int(id_number[i]) * weights[i] for i in range(17))
mod_value = total_sum % 11
return check_codes[mod_value]
def validate_check_code(id_number):
calculated_check_code = calculate_check_code(id_number)
return calculated_check_code == id_number[-1]
print("校验码合法性:", validate_check_code(id_number))
三、提取身份证号中的信息
在校验了身份证号的合法性之后,我们可以提取身份证号中的有用信息,比如出生日期、性别和地址。
提取出生日期
我们已经在解析身份证号时提取了出生日期,这里我们可以将其格式化为更易读的形式。
def format_birth_date(birth_date):
return f"{birth_date[:4]}年{birth_date[4:6]}月{birth_date[6:]}日"
print("出生日期:", format_birth_date(birth_date))
提取性别
性别可以通过顺序码的最后一位来判断,奇数表示男性,偶数表示女性。
def extract_gender(order_code):
return "男" if int(order_code[-1]) % 2 == 1 else "女"
print("性别:", extract_gender(order_code))
提取地址
地址可以通过地址码来查找。
def extract_address(address_code):
return address_code_dict.get(address_code, "未知地址")
print("地址:", extract_address(address_code))
四、完整的身份证号校验和信息提取程序
将上述所有部分组合在一起,我们可以得到一个完整的身份证号校验和信息提取程序。
from datetime import datetime
address_code_dict = {
"110000": "北京市",
"110100": "北京市市辖区",
"110101": "北京市东城区",
# ... 其他代码
}
def parse_id_number(id_number):
address_code = id_number[:6]
birth_date = id_number[6:14]
order_code = id_number[14:17]
check_code = id_number[17]
return address_code, birth_date, order_code, check_code
def validate_address_code(address_code):
return address_code in address_code_dict
def validate_birth_date(birth_date):
try:
datetime.strptime(birth_date, "%Y%m%d")
return True
except ValueError:
return False
def validate_order_code(order_code):
return order_code.isdigit() and len(order_code) == 3
def calculate_check_code(id_number):
weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check_codes = "10X98765432"
total_sum = sum(int(id_number[i]) * weights[i] for i in range(17))
mod_value = total_sum % 11
return check_codes[mod_value]
def validate_check_code(id_number):
calculated_check_code = calculate_check_code(id_number)
return calculated_check_code == id_number[-1]
def format_birth_date(birth_date):
return f"{birth_date[:4]}年{birth_date[4:6]}月{birth_date[6:]}日"
def extract_gender(order_code):
return "男" if int(order_code[-1]) % 2 == 1 else "女"
def extract_address(address_code):
return address_code_dict.get(address_code, "未知地址")
def validate_id_number(id_number):
if len(id_number) != 18:
return False, "身份证号长度不正确"
address_code, birth_date, order_code, check_code = parse_id_number(id_number)
if not validate_address_code(address_code):
return False, "地址码不合法"
if not validate_birth_date(birth_date):
return False, "出生日期不合法"
if not validate_order_code(order_code):
return False, "顺序码不合法"
if not validate_check_code(id_number):
return False, "校验码不合法"
return True, {
"地址": extract_address(address_code),
"出生日期": format_birth_date(birth_date),
"性别": extract_gender(order_code)
}
id_number = "11010519491231002X"
is_valid, info = validate_id_number(id_number)
if is_valid:
print("身份证号合法")
print("提取的信息:", info)
else:
print("身份证号不合法:", info)
这个完整的程序包括了身份证号的解析、校验和信息提取功能。通过这个程序,我们可以方便地验证身份证号的合法性,并提取其中的有用信息。希望这篇文章对你理解和编写身份证号校验程序有所帮助。
相关问答FAQs:
如何使用Python验证身份证号码的合法性?
在Python中,可以通过编写一个函数来验证身份证号码的合法性。首先,检查身份证号的长度是否为18位,接着验证每位数字的范围及最后一位的校验位。可以使用正则表达式来匹配身份证的基本格式,然后进行详细的检查。
Python程序如何生成随机身份证号码?
要生成随机身份证号码,可以使用Python的随机库。可以先随机生成前17位数字,并根据前17位计算出校验位。这样生成的身份证号码不仅是随机的,还会符合身份证的基本规则。
如何在Python中提取身份证号码的出生日期?
提取身份证号码中的出生日期非常简单。对于18位身份证,可以通过字符串切片获取第7到第14位的数字,格式为YYYYMMDD。将这部分字符串转换为日期格式,可以方便后续的日期处理和计算。