Python实战小项目之身份证信息校验

Python实战小项目之身份证信息校验

项目说明

此项目旨在实现对中国大陆身份证号码进行校验的功能,以判断身份证号码的有效性与真实性。

实现方法

身份证号码校验的方法可以分为两种:一种是基于规则的校验方法,另一种是基于算法的校验方法。

  • 基于规则的校验方法:通过验证身份证号码的长度、格式、省份、出生日期、性别和校验位等规则,来判断身份证号码是否有效。
  • 基于算法的校验方法:通过对身份证号码进行计算和处理,再与校验位进行比对,来判断身份证号码是否真实。

在此项目中,我们将使用基于规则的校验方法来实现身份证号码校验的功能。

详细步骤

步骤一:获取身份证号码

我们首先需要让用户输入身份证号码,可以通过 input 函数获取用户输入的内容,如下所示:

id_num = input("请输入身份证号码:")

步骤二:校验身份证号码长度

根据国家标准,身份证号码的长度为18位。因此,我们需要对用户输入的身份证号码进行长度检验,判断其是否为18位。

if len(id_num) != 18:
    print("身份证号码长度错误")
    exit()

步骤三:校验身份证号码格式

身份证号码格式如下所示:前六位为行政区划代码、接下来八位为出生年月日、最后四位为顺序编号和校验码。其中,出生年月日采用的是YYYYMMDD的格式,且必须为合法日期。

为了校验身份证号码的格式,我们需要使用Python中的正则表达式模块 re。具体实现如下:

import re

# 定义身份证号码正则表达式
id_num_pattern = r'^\d{6}(19|20)\d{2}(0[1-9]|1[0-2])([0-2][1-9]|[1-3][0-1])\d{3}[0-9X]$'

# 判断身份证号码格式是否正确
if not re.match(id_num_pattern, id_num):
    print("身份证号码格式错误")
    exit()

步骤四:校验身份证号码省份

身份证号码的前六位代码表示省、市、县的行政区划代码,其中第1-2位表示省份,第3-4位表示城市,第5-6位表示县区。

我们可以将代码对照表保存为字典,然后通过身份证号码的前两位进行省份校验。代码如下所示:

# 行政区划代码与省份的代码对照表
district_code_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": "澳门特别行政区",
}

# 提取身份证号码前两位,用于校验省份
province_code = id_num[:2]

# 判断省份是否正确
if province_code not in district_code_dict.keys():
    print("省份代码错误")
    exit()

步骤五:校验身份证号码出生日期和性别

身份证号码的第7位到第14位是出生日期,其中第7位和第8位是年份,第9位和第10位是月份,第11位和第12位是日期。根据这些数据可以判断出身份证持有人的出生日期。

同时,身份证号码的倒数第二位是奇数表示男性,偶数表示女性。我们可以利用这一规律来校验身份证号码的性别。

# 获取身份证号码中的出生日期和性别
if int(id_num[16]) % 2 == 0:
    gender = "女"
else:
    gender = "男"

birthday_str = id_num[6:14]
birthday_year = int(birthday_str[0:4])
birthday_month = int(birthday_str[4:6])
birthday_day = int(birthday_str[6:8])

# 判断出生日期是否合法
import datetime
try:
    birthday = datetime.datetime.strptime(birthday_str, '%Y%m%d')
except ValueError:
    print("身份证号码的出生日期格式错误")
    exit()

步骤六:校验身份证号码校验位

校验位是身份证号码的最后一位,它是通过前面17位计算得到的。校验位的计算方法是:

  1. 将身份证号码前17位分别乘以不同的系数:第1位乘以7,第2位乘以9,第3位乘以10,第4位乘以5,第5位乘以8,……,第16位乘以2,第17位乘以1。
  2. 将这17个乘积相加,得到一个结果S。
  3. 将结果S除以11取余数M。
  4. 根据余数M,得到对应的校验位,校验位的计算方法如下表所示:
余数M 校验位P
0 1
1 0
2 X
3 9
4 8
5 7
6 6
7 5
8 4
9 3
10 2

我们可以使用下列代码实现校验号码的校验位:

# 计算校验位
weight_list = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check_code_list = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
checksum = sum([int(id_num[i]) * weight_list[i] for i in range(17)]) % 11
check_code = check_code_list[checksum]

# 判断校验位是否正确
if id_num[-1] != check_code:
    print('身份证号码校验位错误')
    exit()

步骤七:输出身份证号码信息

经过以上步骤的校验,如果身份证号码有效,则输出身份证号码的信息。

print("身份证号码:%s" % id_num)
print("省份:%s" % district_code_dict[province_code])
print("出生日期:%s" % birthday.strftime('%Y年%m月%d日'))
print("性别:%s" % gender)

实例演示

假设用户输入的身份证号码是:440524197510201256

请输入身份证号码:440524197510201256
身份证号码:440524197510201256
省份:广东省
出生日期:1975年10月20日
性别:男

再来一个例子,用户输入的是错误的身份证号码:32058219980916706X

请输入身份证号码:32058219980916706X
身份证号码格式错误

总结

通过本文的身份证号码校验实现过程,可以学习到如下几点内容:

  • Python中的正则表达式模块 re 的使用方法。
  • Python中的字典类型的创建和使用方法。
  • Python中的字符串截取方法和日期格式化方法的使用。
  • Python中的校验码计算方法和位数(17或18位)。
  • 进行校验时,需先验证出生日期。
  • 身份证号码校验还可以使用算法实现,不过需要消耗更大的计算量。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实战小项目之身份证信息校验 - Python技术站

(0)
上一篇 2023年6月13日
下一篇 2023年6月13日

相关文章

  • Pycharm报错Non-zero exit code (2)的完美解决方案

    下面是完整的“Pycharm报错 Non-zero exit code (2) 的完美解决方案”攻略: 1. 问题背景 在使用 Pycharm 编写 Python 代码时,我们有时候会遇到这样的问题:当我们尝试运行一个程序或调试一个程序时,Pycharm 给出了这样的错误:Non-zero exit code (2)。对于这个问题,我们需要知道它的原因以及如…

    python 2023年6月13日
    00
  • Pytorch对Himmelblau函数的优化详解

    Pytorch对Himmelblau函数的优化详解 简介 本文将详细讲解使用Pytorch对Himmelblau函数进行优化的完整攻略。Himmelblau函数是一个在数学领域中很有意思的函数,它拥有多个局部极小值点和全局极小值点。在本文中,我们将使用Pytorch来寻找Himmelblau函数的全局最小值。 Himmelblau函数 Himmelblau函…

    python 2023年6月13日
    00
  • pandas实现选取特定索引的行

    选取特定索引的行通常用于数据的筛选和分析。在pandas中,可以使用loc和iloc方法实现选取特定索引的行。 loc方法 语法 df.loc[行索引, 列索引] 示例 例如,有一个包含成绩和姓名的数据集,包括以下内容: 姓名 语文 数学 英语 张三 70 80 90 李四 80 70 60 王五 60 90 80 如果要选取李四的成绩,可以使用loc方法:…

    python 2023年6月13日
    00
  • 对pandas将dataframe中某列按照条件赋值的实例讲解

    对于Pandas将DataFrame中某列按照条件赋值的实例,可以分为以下步骤进行: 使用Pandas读取数据并创建DataFrame对象。 定义被用来更新某列数据的条件(statement)。 使用.loc[condition, ‘column’]来定位符合条件的某列数据,并进行更新。 以下是两个具体的示例: 示例一:将DataFrame中某列大于3的数全…

    python 2023年6月13日
    00
  • pandas.dataframe按行索引表达式选取方法

    当我们使用pandas库进行数据分析时,最常见的数据格式之一就是数据帧(DataFrame),因此如何对DataFrame进行行索引的操作是非常重要的技能。本文将为大家详细讲解pandas.dataframe按行索引表达式选取方法,并且包含两个示例说明。 一、pandas.dataframe按行索引表达式选取方法 在pandas中,对DataFrame进行行…

    python 2023年6月13日
    00
  • Pandas中DataFrame的常用用法分享

    下面是Pandas中DataFrame的常用用法分享的完整攻略。 一、Pandas简介 Pandas是Python数据处理的重要工具之一,它提供了快速、灵活、富有表现力的数据结构,使得数据分析处理变得更加简单。 二、DataFrame的定义 在Pandas中,DataFrame是一种二维的表格型数据结构。它包含了一组有序的列,每列可以是不同的值类型。其中一个…

    python 2023年6月13日
    00
  • pandas将DataFrame的列变成行索引的方法

    需要将DataFrame的列转换为行索引时,可以使用set_index()方法。该方法可接受要转换为行索引的列的名称或索引位置作为参数。 下面是将列“name”转换为行索引的代码示例: import pandas as pd data = {‘id’: [1, 2, 3], ‘name’: [‘Alice’, ‘Bob’, ‘Charlie’], ‘age’…

    python 2023年6月13日
    00
  • 使用pandas实现筛选出指定列值所对应的行

    使用pandas可以方便地进行数据处理和筛选。下面是使用pandas筛选出指定列值所对应的行的攻略: 步骤一:导入必要的库和数据 首先,我们需要导入必要的库,其中包括pandas库。 import pandas as pd 接着,我们需要加载数据,这里以读取csv文件为例: df = pd.read_csv(‘data.csv’) 步骤二:筛选出指定列值所对…

    python 2023年6月13日
    00
合作推广
合作推广
分享本页
返回顶部