python 身份证号的有效性、生日(阴历阳历)、星座、生肖、性别、年龄、户籍所在地测试

  • 0x01 前言
  • 0x02 身份证号码格式
  • 0x03 地区
  • 0x04 代码
  • 0x05 效果

0x01 前言

本项目,仅用来学习使用,不可用作非法用途,项目主要用来解析身份证号码。

0x02 身份证号码格式

来自于网友,具体可百度,如何计算有效位,自行百度。

1.前1、2位数字表示:所在省(直辖市、自治区)的代码;
2.第3、4位数字表示:所在地级市(自治州)的代码;
3.第5、6位数字表示:所在区(县、自治县、县级市)的代码;
4.第7-14位数字表示:出生年、月、日;
5.第15、16位数字表示:所在地的派出所的代码;
6.第17位数字表示性别:奇数表示男性,偶数表示女性;
7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生, 用来检验身份证的正确性。校检码可以是0—9的数字,有时也用x表示。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现x,但如果尾号是10,那么就得用x来代替,因为如果用10做尾号,那么此人的身份证就变成了19位。x是罗马数字的10,用x来代替10,可以保证公民的身份证符合国家标准。

0x03 地区

关于身份证号前六位所代表的具体地区,数据来源于网络,本次数据来源于网站:https://www.cnblogs.com/sunbingqiang/p/9273362.html,我是写了个爬虫脚本,把这些数据爬了下来,然后构造成了json格式。

{"110000": {"addressID": "110000","ProvinceID": "11","ProvinceName": "北京市","townName": "北京市","RegionName": "华北地区"},"110100": {"addressID": "110100","ProvinceID": "11","ProvinceName": "北京市","townName": "市辖区","RegionName": "华北地区"},"110101": {"addressID": "110101","ProvinceID": "11","ProvinceName": "北京市","townName": "东城区","RegionName": "华北地区"},...
}

0x04 代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/5/29 10:20
# @Author  : H
# @File    : checkID.py
# https://www.cnblogs.com/sunbingqiang/p/9273362.htmlimport json
import sxtwl
import datetimeid = '18位身份证号码'"""校验省份证号时候有效"""def checkID(id):xishu_17 = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]xishu_18 = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]sum = 0for i in range(17):sum = xishu_17[i] * int(id[i]) + sumif id[17] == 'x' or id[17] == 'X':flag = 10else:flag = int(id[17])if flag == xishu_18[sum % 11]:return "身份证号校验正确"else:return "error""""校验省份证号时候有效:百度百科给出的方法"""def checkID01(id):flag = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'][sum([int(id[i]) * [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2][i] for i in range(17)]) % 11]if id[17] == flag:return "身份证号校验正确"else:return "error""""check men or women"""def checkGender(id):if int(id[16]) % 2 == 1:return "男"else:return "女""""检测所在城市"""def checkCity(id):cityNum = int(id[:4]) * 100areaNum = int(id[:6])cityID = json.load(open("city.json", encoding="utf-8"))if cityID.get(str(areaNum)) != None:city = f"{cityID[str(areaNum)]['RegionName'] + ' ' + cityID[str(areaNum)]['ProvinceName'] + ' ' + cityID[str(cityNum)]['townName'] + ' ' + cityID[str(areaNum)]['townName']}"return cityelse:return "error""""检测出生年月"""def checkBirthday(id):year = int(id[6:10])month = int(id[10:12])day = int(id[12:14])return f"{year}年 {month}月 {day}日""""计算星座"""def Zodiac(id):month = int(id[10:12])day = int(id[12:14])names = (u'摩羯座', u'水瓶座', u'双鱼座', u'白羊座', u'金牛座', u'双子座', u'巨蟹座', u'狮子座', u'处女座', u'天秤座', u'天蝎座', u'射手座')days = ((1, 20), (2, 19), (3, 21), (4, 21), (5, 21), (6, 22), (7, 23), (8, 23), (9, 23), (10, 23), (11, 23), (12, 23))return names[len(list(filter(lambda y: y <= (month, day), days))) % 12]"""阳历转阴历,并求生肖"""def Solar2Lunar(id):year = int(id[6:10])month = int(id[10:12])day = int(id[12:14])lunar = sxtwl.Lunar()data = {}# 日历中文索引ymc = ["十一", "腊", "正", "二", "三", "四", "五", "六", "七", "八", "九", "十"]rmc = ["初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八","十九","二十", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十", "卅一"]# 通过阳历获取查询日期信息days = lunar.getDayBySolar(year, month, day)data['公历'] = str(days.y) + "年 " + str(days.m) + "月 " + str(days.d) + "日"if days.Lmc < 2:y = days.y - 1else:y = days.ydata['生肖'] = "猴鸡狗猪鼠牛虎兔龙蛇马羊"[y % 12]if days.Lleap:data['阴历'] = str(y) + "年 " + "润" + str(ymc[days.Lmc]) + "月" + str(rmc[days.Ldi]) + "日"else:data['阴历'] = str(y) + "年 " + str(ymc[days.Lmc]) + "月" + str(rmc[days.Ldi]) + "日"return data"""计算年龄"""# 判断是否为闰年
def is_leap(year):if year % 400 == 0 or year % 40 == 0 or year % 4 == 0:return Trueelse:return Falsedef howOldAreYou(id):year = int(id[6:10])month = int(id[10:12])day = int(id[12:14])birthday = datetime.datetime(year, month, day)today = datetime.date.today()month_days = {1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31}y = today.year - birthday.yearm = today.month - birthday.monthd = today.day - birthday.dayif d < 0:if birthday.month == 2:if is_leap(birthday.year):month_days[2] = 29d += month_days[birthday.month]m -= 1if m < 0:m += 12y -= 1if y == 0:if m == 0:return ('{}天'.format(d))else:return ('{}月 {}天'.format(m, d))else:return ('{}岁 {}月 {}天'.format(y, m, d))def check(id):if checkID(id) != "error":print("*" * 100)print(f"身份证号:\t{id}")print(f"性别:\t{checkGender(id)}")print(f"生肖:\t{Solar2Lunar(id)['生肖']}")print(f"星座:\t{Zodiac(id)}")print(f"生日:\t{checkBirthday(id)}")print(f"公历:\t{Solar2Lunar(id)['公历']}")print(f"阴历:\t{Solar2Lunar(id)['阴历']}")print(f"年龄:\t{howOldAreYou(id)}")print(f"地区:\t{checkCity(id)}")print("*" * 100)else:print("身份证号校验错误!")

0x05 效果

python 身份证号的有效性、生日(阴历阳历)、星座、生肖、性别、年龄、户籍所在地测试相关推荐

  1. JavaScript - 从身份证号中获取生日

    JavaScript - 从身份证号中获取生日 知识点 正则表达式(字面量) 字符串拆分 参数一为开始位置索引 S 想要N个字母,E = S+N,E为结束位置索引(开) let reg = /(^\d ...

  2. 使用js验证身份证号格式以及身份证号中的生日验证

    由于不管是测试项目练手还是实际项目开发,都应该考虑数据的严密性和软件的通俗易懂的实用性,下面是我用js实现的验证身份证号格式以及身份证号中的生日验证代码 //生日移出点击事件验证身份证号中的生日验证 ...

  3. 无聊之作-生日阴历阳历重合日期

    今天是我的阴历生日和我女票的阳历生日重合之日,决定一起过生日 于是想到到底会有几次这样的日子的产生,因此在网上查到了用python做阳历到阴历转换的代码,拿来用 阳历转阴历代码来自:https://w ...

  4. python身份证号掩盖出生日期的代码_利用Python制作全国身份证号验证及查询系统!就问你吊不吊!...

    大家好哇,又是一个愉快的周末,今天本鸟给大家分享1个有趣的实战项目,用python制作"全国身份证号验证及查询系统",成品界面如下图: 本系统可以实现身份证号真伪验证,年龄.性别及 ...

  5. 检验身份证号的有效性并输出有问题的号码

    摘要:一个合法的身份证号码共18位,由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9 ...

  6. C# 检验身份证号并提取生日和性别

    /// <summary>         /// 验证身份证号码         /// </summary>         /// <param name=&quo ...

  7. 通过身份证号获取用户生日

    作者:吱韩菌 开发工具:Visual Studio 2015 撰写时间:2019-6-26 在使用的众多软件中,都会涉及到填写用户的基本信息,无论是流程过于繁杂.还是填写的信息较多,都会影响用户对该款 ...

  8. 头歌python 身份证号的奥秘

    第1关:判断性别 任务描述 通过身份证的第17位也就是倒数第二位的数字可以辨别该身份证所属人的性别,奇数为男性,偶数为女性. 本关任务:输入身份证号,第17位若是偶数,输出男性,否则输出女性 相关知识 ...

  9. python身份证号判断性别。1.判断身份证长度是否正确 2.判断性别

    从键盘上输入身份证号码串,判断长度是否为18位,若不等于18位,则输出"身份证号有误":若等于18位,用身份证号码的倒数第2位来判断此人的性别,若为奇数,则输出"男性&q ...

最新文章

  1. R语言return返回值的形式实战
  2. git 从入门到精通
  3. loadrunner 关联匹配多个值
  4. 怎么让模糊的数字变清楚_一键模糊图像变清晰,好家伙!这款神器插件你值得拥有...
  5. 计算机二级考试c语言公共知识,2016年电大最新计算机二级考试c语言公共基础题知识点.doc...
  6. java class 内容查看_015-JVM-使用javap查看class文件内容
  7. 解决POI读取Excel内存溢出的问题
  8. 嵌入式论文3000字_毕业论文写完之后,你还要做的几件事
  9. android笔记集one
  10. [译]C#控制管理VisualSVN Server
  11. oracle中索引的类型,oracle索引类型normal
  12. 系统可靠性分析与设计
  13. 十二属相配对与最佳配偶
  14. Keras或者Tensorflow出现:Optimization loop failed: Cancelled: Operation was cancelled
  15. 如何将页脚固定在页面底部,而不是屏幕底部!
  16. DllNotFoundException
  17. java 微信服务器录音下载到自己服务器,并转为wav格式
  18. 周口计算机教师招聘,周口商水县2018年招聘高中信息技术教师面试人员名单
  19. MSTP+VRRP综合实验
  20. 【纪中集训2019.3.15】恶熊咆哮

热门文章

  1. 可调速自动播放ppt
  2. 简述子网掩码与子网掩码划分(以C类地址为例)
  3. RN拆包实践的一些经验教训
  4. 与高手连接有哪些常用的方法?
  5. 男女有别:行为抑制系统和腹内侧前额叶皮层连接的性别差异
  6. matlab小车直线加速动画,通过MATLAB/Simulink处理测试数据加速车辆控制算法仿真和设计...
  7. Python-Django毕业设计基于Java的班主任管理系统的实现(程序+Lw)
  8. 【shell案例】判断主机是否在线
  9. 极客标签前端特效资源精品大荟萃#002
  10. 限制软件试用期的简单思路