接上文,将完整地址信息和行政编码添加到原本数据新的一列中
1. 可以直接在txt文件中完成,也可以在数据库中完成,我通过txt完成,数据库需要注意更多方面的信息如导出的表应该多添加一列如添加一个原始地址,可以方便后期插入的时候where条件有可写内容,不然不管是插入还是更新都挺麻烦的,因为和原来的表中没有一列可以联系起来(我...)
上次我们处理后的数据如下
(完整地址信息)
(地址编码)
原始表(接下来需要将上面两个信息插入到这个表中)
实现代码:
""" 整合数据,将行政区代码、完整地址信息整合到原始表中 """ import pandas as pd import codecs # 读取文本中指定的某一列数据 f1 = codecs.open('addlistrs.txt',mode='r',encoding='utf-8') f2 = codecs.open('alllistrs.txt',mode='r',encoding='utf-8') lines1 = f1.readlines() lines2 = f2.readlines() f2.close() f1.close() addlist=[] # 完整地址信息 codelist = [] # 行政编码 for line in lines1: # print(line.strip()) addlist.append(line.strip()) for line in lines2: codelist.append(line.strip().split(",")[3]) # print(codelist[1]) # 将这两个数据整合到test表中,导入一列数据:原文件每一行最后都要加一个数据 # 注意:w文件若存在,首先清空,然后(重新)创建 file_read = codecs.open('test.txt',mode='r',encoding='utf-8') lines = file_read.readlines() file_write = codecs.open('test.txt',mode='w',encoding='utf-8') # 以可写模式打开该文件 i=0 for line in lines: # print(line.strip()) line_new = line.strip()+ ',' + addlist[i] + ',' + codelist[i]+'\n' i += 1 # print(line_new) file_write.write(line_new)
实现结果:
ok,接下来就是将上面的代码运用到真实的数据中了,上面是挑取的几个数据。。记得先备份一下,还有看清楚真实数据的格式是否和自己挑取规定的一样。
Python小坑:open()和codecs.open()区别,以及常见指令和操作指令_用codecs.open和open-CSDN博客
python 读取txt文件并在txt每行文件后面增加内容_python在文件某行后添加内容-CSDN博客
也素出现大问题好吧。。。
1.首先数组越界
所以去看原始数据,结果可能原本的数据有含有换行符之类的,导致这种情况的出现,看的我眼睛疼。。。类似于2950这一行,是上一行的数据来的,要手动修改。。。
ok,眼瞎过后,也是成功了。。。好开心又可以加深近视辣太好辣。。。
2.地址可能是空的情况下,不应该继续调用百度接口进行地址编码或逆地址编码
添加判断即可,但是即使是空数据,也需要保存为空。
这里判断的时候,需要这样子写。
ok也是增加判断了没问题了,ok那么如果地址是一个乱七八糟的东西呢》》》,所以还是要解决返回失败的参数,这里是0 ,那我们就直接先判断他就好了。
修改一下代码,运行了一段时间,没有发现什么问题,但是我百度平台超余额了。。
就先做到这把,暂时没什么问题。。
实现代码如下:
# -*- coding: utf-8 -*- """ 整合test1test2应用于原始的大量数据 给地址添加行政编码 """ import codecs import requests import numpy as np """ 抽取地址,调用接口查看该地址属于哪个省市区 """ # 1.获取需要的地址数据 # def splittxt(): # f = codecs.open('t1_test_test.txt', mode='r', encoding='utf-8') f = codecs.open('1234.txt', mode='r', encoding='utf-8') lines = f.readlines() list = [] lnglist = [] # 经度 latlist = [] # 维度 addlist = [] # 标准地址格式省市区 alllist=[] # 将标准地址省市区组合在一起 codelist=[] # 存储行政编码 for line in lines: # print(line.strip().split("|")[15]) list.append(line.strip().split("|")[15]) # f.close() # print(list[0]) # 2.调用百度api实现提取地点的经纬度 def getJingWei(address): url = "https://api.map.baidu.com/geocoding/v3" params = { "address": address, "output": "json", "ak": "你的ak密钥", } response = requests.get(url=url, params=params) result = response.json() status=result['status'] if(status!=0): addlist.append("") codelist.append("") lnglist.append("") latlist.append("") alllist.append("") else: lnglist.append(result['result']['location']['lng']) # 经度 latlist.append(result['result']['location']['lat']) # 纬度 # 3.通过经纬度获取地址信息(省市区) def getAddress(lng, lat): response = requests.get('https://api.map.baidu.com/reverse_geocoding/v3/?ak=你的ak密钥&output=json&coordtype=wgs84ll&location='+str(lat)+','+str(lng)) # if response: # print(response.json()) result = response.json() # print(result) addlist.append(result['result']['formatted_address']) alllist.append(result['result']['addressComponent']['province']+','+result['result']['addressComponent']['city']+','+result['result']['addressComponent']['district']+','+result['result']['addressComponent']['adcode']) codelist.append(result['result']['addressComponent']['adcode']) # 测试 for i in range(len(list)): # print(len(list[i])) # 注意不能写成list[i]==""或者len(list[i])==0,通过上一条代码可以看见长度为2. print(list[i]) getJingWei(list[i]) # 先判断一下地址编码是否成功,成功在进行下一步:获取完整的地址信息 if (len(addlist)<i+1): getAddress(lnglist[i],latlist[i]) # print("=====",addlist[i]) file_write = codecs.open('result.txt',mode='w',encoding='utf-8') # 以可写模式打开该文件 i=0 for line in lines: # print(line.strip()) # 根据实际的数据文件格式修改一下 line_new = line.strip()+ '|"' + addlist[i] + '"|"' + codelist[i]+'"\n' i += 1 # print(line_new) file_write.write(line_new) f.close() file_write.close()
文件写入应该没问题,之前小数据测试过。