一个身份证验证接口[3]

幸亏老子从原来的文章提取出一部分还能够用的信息。python

 

步骤:mysql

1, 从未被删除的数据中恢复了三千多个城市,分别插入到idcard_address表中。sql

2, 发现恢复的数据是新GB/T2600的版本,不少旧版本的编码没有了,行政编码的GB/T2600有9个版本,不少城市有了新的编码,可是用了老的编码的身份证仍然有效,因此要找齐全部的版本编码才算齐全,无奈年代久远,网络资料有限,能找到的最先版本为1999年版本,是一个扫描生成的PDF文档,没法复制粘贴,须要一个一个手打到excle里面而后用python从excle里面逐行读取,速度很慢,因此只截取了几个省份(北京天津河北山西内蒙古江西等)。数据库

3, 文件的数据和idcard_address表的数据共同插入到新表中: idcard_address_all.apache

以下bash

建表网络

# 部分表
CREATE TABLE `idcard_address` (
  `id` int(4) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `address_id` int(6) unsigned NOT NULL DEFAULT '0' COMMENT '行政区划编号',
  `address_name` varchar(40) NOT NULL DEFAULT '' COMMENT '行政区划名称',
  PRIMARY KEY (`id`),
  KEY `idx_ai_an` (`address_id`,`address_name`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='行政区划表';

# 一块儿表
CREATE TABLE `idcard_address_all` (
  `id` int(4) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `address_id` int(6) unsigned NOT NULL DEFAULT '0' COMMENT '行政区划编号',
  `address_name` varchar(40) NOT NULL DEFAULT '' COMMENT '行政区划名称',
  PRIMARY KEY (`id`),
  KEY `idx_ai_an` (`address_id`,`address_name`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='行政区划表';

代码app

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# encoding=utf-8
# Filename: cityZoneDB.py
'''全国行政区划号码数据库'''


import MySQLdb
import sys
import re
import os
reload(sys)
sys.setdefaultencoding('utf-8')

class CZDB:

    def __init__(self):

        self.host = 'localhost'
        self.port = '3306'
        self.username = 'root'
        self.password = '123456'
        self.dbname = 'python'
        self.charset = 'utf8'
        self.oldtable = 'idcard_address'
        self.newtable = 'idcard_address_all'

    def connect(self):
        try:
            self.dbConnection = MySQLdb.connect(host=self.host, user=self.username, passwd=self.password, db=self.dbname, charset='utf8')
            # 打开数据库链接
            if self.dbConnection:
                self.cursor = self.dbConnection.cursor()
                print '数据库链接成功'
                return True
            else:
                print '数据库链接失败'
                return False
        except:
            print '数据库链接失败'
            return False

    # 插入数据
    def insertData(self, cities):
        # 整理获取到的数据
        values = []
        for city in cities:
            value = (int(city[0]), city[1])
            values.append(value)

        self.connect()
        try:
            self.cursor.executemany("insert into idcard_address_all(`address_id`,`address_name`) values(%s,%s)", values)
            self.dbConnection.commit()
            print '成功插入%d条数据到%s表' % (len(values), self.newtable)
        except Exception as e:
            print e
            self.dbConnection.rollback()
        self.dbConnection.close()

    # 获取文件中的数据
    def getFileData(self):
        filedict = {}
        fo = open("/home/c80k2/桌面/爬虫/行政区划/测试", "r")
        fo.seek(os.SEEK_SET)
        for line in fo.readlines():
            if line.strip() != '':
                code = re.findall('\d\d\d\d\d\d', line)[0]
                name = line.replace(code, '').strip('\t\n')
                filedict[code] = name
        fo.close()
        print '成功获取/home/c80k2/桌面/爬虫/行政区划/测试的数据'
        return filedict

    # 从表中获取数据
    def getDBData(self):
        dbdict = {}
        try:
            self.connect()
            # 执行SQL语句
            self.cursor.execute("select address_id,address_name from %s" % self.oldtable)
            # 获取全部记录列表
            results = self.cursor.fetchall()
            for row in results:
                code = int(str(row[0]).strip('L'))
                dbdict[code] = row[1]
        except:
            print "Error: unable to fecth data"

        # 关闭数据库链接
        self.dbConnection.close()
        print '成功获取DB数据'
        return dbdict

    # 获取全部数据
    def getAllData(self):
        fileData = self.getFileData()
        dbData = self.getDBData()
        # 对fileData进行去重处理
        for key, value in fileData.items():
            if dbData.has_key(str(key)) or dbData.has_key(int(key)):
                continue
            else:
                dbData[int(key)] = value
        # 对新字典进行排序
        sortedCityDict = dbData.items()
        sortedCityDict.sort()
        print '成功获取所有数据'
        return sortedCityDict

    # 插入所有数据到数据库
    def insertAllData(self):
        cities = self.getAllData()
        self.insertData(cities)

czdb = CZDB()
czdb.insertAllData()

运行结果测试

成功获取/home/c80k2/桌面/爬虫/行政区划/测试的数据
数据库链接成功
成功获取DB数据
成功获取所有数据
数据库链接成功
成功插入3928条数据到idcard_address_all表
mysql> select count(1) from idcard_address;
+----------+
| count(1) |
+----------+
|     3744 |
+----------+
1 row in set (0.01 sec)

mysql> select count(1) from idcard_address_all;
+----------+
| count(1) |
+----------+
|     3928 |
+----------+
1 row in set (0.00 sec)

总结:fetch

连mysql的时候不能直接在初始化方法中链接,这样会形成mysql 2006 'MySQL server has gone away' 的错误。

相关文章
相关标签/搜索