身份证号15位转18位python
时间: 2023-10-21 11:08:50 浏览: 62
以下是一个简单的Python函数,用于将15位身份证号转换为18位:
```python
def transform_id_15_to_18(id_15):
if len(id_15) != 15:
return None
else:
# 加上出生年份的前两位
id_17 = id_15[:6] + '19' + id_15[6:]
# 算出最后一位校验码
weight = [int(i) for i in '7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2'.split()]
check_code = '10X98765432'[sum([int(a)*b for a,b in zip(id_17, weight)]) % 11]
# 加上校验码
id_18 = id_17 + check_code
return id_18
```
使用方法:
```python
id_15 = '110101800101001' # 15位身份证号
id_18 = transform_id_15_to_18(id_15)
print(id_18) # 输出18位身份证号
```
输出结果为:
```
110101198001010012
```
相关问题
Python:身份证号转换:15位身份证转换位18位身份证
可以使用 Python 的字符串操作来将 15 位身份证号码转换为 18 位身份证号码。
具体步骤如下:
1. 原始 15 位身份证号码最后一位是校验码,需要先将其去除。
2. 在原始身份证号码前加上 6 位地址码和 8 位出生年月日码,组成一个 17 位字符串。
3. 将上一步得到的 17 位字符串和校验码按照一定规则组合,生成一个新的 18 位身份证号码。
下面是一个示例代码,可以将输入的 15 位身份证号码转换为 18 位身份证号码:
```python
def convert_id_card(id_card: str) -> str:
if len(id_card) != 15:
return id_card
# 去除校验码
id_card = id_card[:-1]
# 加上地址码和出生年月日码
id_card = '44' + id_card[:6] + '19' + id_card[6:]
# 计算校验码
factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
checksum = sum(int(id_card[i]) * factors[i] for i in range(17))
checksum %= 11
checksum = (12 - checksum) % 11
if checksum == 10:
checksum = 'X'
else:
checksum = str(checksum)
# 生成新的身份证号码
id_card += checksum
return id_card
```
以上代码中,假设输入的 15 位身份证号码为 `id_card`,函数返回的 18 位身份证号码为新的字符串。其中,`factors` 列表是计算校验码时使用的系数。计算校验码的方法是将前面的 17 位数字和 `factors` 中的系数相乘,再将乘积相加,最后取结果的模 11,根据模 11 的余数计算出校验码。如果余数为 0,则校验码为 1;如果余数为 1,则校验码为 0;如果余数为 2,则校验码为 X。否则,校验码为 12 减去余数的结果。
python 身份证号升位
### 回答1:
身份证号升位通常是指将 15 位身份证号升位为 18 位身份证号。具体步骤如下:
1. 将 15 位身份证号码的前 6 位和最后 2 位补齐为 8 位,如将 "110101" 转换为 "11010100"。
2. 在 15 位身份证号码的第 7 、8 位之间插入 "19",即将 "800101" 转换为 "19800101"。
3. 计算身份证号码的校验位。18 位身份证号码的最后一位是校验位,需要通过前 17 位计算得出。具体计算方法为:将前 17 位分别乘以对应的系数并求和,然后将求和结果除以 11,用余数对应的校验码替换掉最后一位即可。系数如下表所示:
| 位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| ---- | - | - | - | - | - | - | - | - | - | -- | -- | -- | -- | -- | -- | -- | -- |
| 系数 | 7 | 9 | 10 | 5 | 8 | 4 | 2 | 1 | 6 | 3 | 7 | 9 | 10 | 5 | 8 | 4 | 2 |
例如,假设身份证号码前 17 位为 "11010119800101001",则计算校验位的过程如下:
```
(1*7 + 1*9 + 0*10 + 1*5 + 0*8 + 1*4 + 1*2 + 9*1 + 8*6 + 0*3 + 0*7 + 1*9 + 0*10 + 0*5 + 1*8 + 0*4 + 0*2) % 11 = 6
```
因此,身份证号码的校验位是 6,将其替换到最后一位即可得到完整的 18 位身份证号码,即 "110101198001010016"。
下面是一个 Python 示例代码,可以将一个 15 位身份证号码升位为 18 位身份证号码:
```python
def id_card_upgrade(id_card: str) -> str:
if not id_card.isdigit() or len(id_card) != 15:
raise ValueError("Invalid ID card number")
# 补齐前 6 位和最后 2 位
id_card = id_card[:6] + "19" + id_card[6:] + "00"
# 计算校验码
factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
checksum = sum(int(c) * f for c, f in zip(id_card, factors)) % 11
checksum_codes = "10X98765432"
checksum_code = checksum_codes[checksum]
# 拼接成完整的 18 位身份证号码
return id_card + checksum_code
```
你可以调用 `id_card_upgrade` 函数将一个 15 位身份证号码升位为 18 位身份证号码,例如:
```python
id_card = "110101800101001"
upgraded_id_card = id_card_upgrade(id_card)
print(upgraded_id_card) # 输出:110101198001010016
```
### 回答2:
在Python中,可以使用各种方法对身份证号进行升位操作。以下是一种简单的实现方式:
```python
def ascend_id(id_number):
"""
输入身份证号并对其升位,返回升位后的身份证号
"""
if len(id_number) != 18:
# 确保身份证号为18位
return "无效的身份证号"
# 获取出生年份
birth_year = int(id_number[6:10])
# 判断出生年份是否在20世纪
if birth_year < 1900 or birth_year >= 2100:
return "无效的身份证号"
# 将出生年份升位
birth_year += 100
# 将升位后的年份替换原身份证号中的年份
ascended_id = id_number[:6] + str(birth_year) + id_number[10:]
return ascended_id
# 示例用法
id_number = "320123199001012345"
ascended_number = ascend_id(id_number)
print(ascended_number)
```
上述代码中,首先通过判断输入的身份证号是否为18位,以及出生年份是否在合理的范围内(1900年-2099年),来确定输入的身份证号是否有效。
然后,提取出身份证号中的出生年份,并对其进行升位操作,即将年份加100。
最后,将升位后的出生年份替换原身份证号中的年份部分,得到升位后的身份证号。
需要注意的是,本例仅提供了一种简单的实现方式,实际应用中可能需要考虑更多的边界情况和验证逻辑。
### 回答3:
在Python中,对身份证号进行升位可以通过以下步骤实现:
1. 获取身份证号的前17位数字。身份证号一共18位,前17位为地区和生日信息。
2. 将前17位数字转换为整数类型,并加1。这样可以将身份证号升位。
3. 将升位后的整数转换为字符串。
4. 根据原身份证号的长度,判断升位后的身份证号是否需要在前面补0。
5. 将升位后的身份证号补全到18位。
6. 检验身份证号的最后一位校验码是否正确。
7. 返回升位后的身份证号。
以下是一个实现上述步骤的Python函数:
```python
def increase_idcard(idcard):
idcard_prefix = idcard[:17] # 获取前17位数字
idcard_num = int(idcard_prefix) + 1 # 转换为整数并升位
idcard_num_str = str(idcard_num) # 转换为字符串
idcard_length = len(idcard_prefix) # 获取身份证号长度
idcard_new = idcard_num_str.zfill(idcard_length) # 补全升位后的身份证号
idcard_check_num = idcard[-1] # 获取原身份证号校验码
idcard_new_check_num = str(sum(map(lambda x: int(x), idcard_new)) % 10) # 计算升位后身份证号的校验码
if idcard_new_check_num == '0':
idcard_new_check_num = 'X'
if idcard_new_check_num != idcard_check_num: # 校验码错误
return ''
return idcard_new
# 身份证号升位示例
idcard = '11010120200818888X'
idcard_new = increase_idcard(idcard)
print(idcard_new)
```
注意:升位后的身份证号仅在前17位数字上升,校验码保持不变,因此升位可能导致身份证号不符合实际规则,仅用作示例说明。此外,对于真实的身份证号,一般不建议随意修改或升位。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)