幸好老子从原来的文章提取出一部分还可以用的信息。
步骤:
1, 从未被删除的数据中恢复了三千多个城市,分别插入到idcard_address表中。
2, 发现恢复的数据是新GB/T2600的版本,很多旧版本的编码没有了,行政编码的GB/T2600有9个版本,很多城市有了新的编码,但是用了老的编码的身份证仍然有效,所以要找齐所有的版本编码才算齐全,无奈年代久远,网络资料有限,能找到的最早版本为1999年版本,是一个扫描生成的PDF文档,无法复制粘贴,需要一个一个手打到excle里面然后用python从excle里面逐行读取,速度很慢,所以只截取了几个省份(北京天津河北山西内蒙古江西等)。
3, 文件的数据和idcard_address表的数据共同插入到新表中: idcard_address_all.
如下


建表
# 部分表
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='行政区划表';代码
#!/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)总结:
连mysql的时候不能直接在初始化方法中连接,这样会造成mysql 2006 'MySQL server has gone away' 的错误。
















