幸亏老子从原来的文章提取出一部分还能够用的信息。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' 的错误。