Python csv模块和pygeocoder出错
我正在使用pygeocoder对地址列表进行地理编码。这是我的代码:Python csv模块和pygeocoder出错,python,csv,encoding,geocoding,Python,Csv,Encoding,Geocoding,我正在使用pygeocoder对地址列表进行地理编码。这是我的代码: import csv import pandas as pd from pygeocoder import Geocoder from pygeocoder import GeocoderError df = pd.read_csv('C:\Users\L\Desktop\germanfdiaddress.csv', encoding="iso-8859-1") address = df.Address print add
import csv
import pandas as pd
from pygeocoder import Geocoder
from pygeocoder import GeocoderError
df = pd.read_csv('C:\Users\L\Desktop\germanfdiaddress.csv', encoding="iso-8859-1")
address = df.Address
print address
add=[]
lat=[]
lng=[]
pcode=[]
for a in address:
try:
result = Geocoder.geocode(a)
lat.extend([result[0].coordinates[0]])
lng.extend([result[0].coordinates[1]])
pcode.extend([result[0].postal_code])
except GeocoderError:
continue
result = Geocoder.geocode(a)
lat.extend([result[0].coordinates[0]])
lng.extend([result[0].coordinates[1]])
pcode.extend([result[0].postal_code])
fields= 'add','lat', 'lng', 'pcode'
rows=zip(address,lat,lng,pcode)
with open('C:\Users\L\Desktop\myfile.csv', 'wb') as outfile:
w = csv.writer(outfile)
w.writerow(fields)
for i in rows:
w.writerow(i)
但是,我收到以下错误:
Traceback (most recent call last):
File "C:\Users\Jesus\Dropbox\coding\python\geocoder with uft-8, with complete output.py", line 42, in <module>
w.writerow(i)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 13: ordinal not in range(128)
回溯(最近一次呼叫最后一次):
文件“C:\Users\Jesus\Dropbox\coding\python\geocoder with uft-8,带有完整的输出.py”,第42行,在
w、 writerow(一)
UnicodeEncodeError:“ascii”编解码器无法对位置13中的字符u'\xfc'进行编码:序号不在范围内(128)
对正在发生的事情有什么想法吗?我知道我的代码除了写入csv文件外还能正常工作
以下是csv文件:csv模块存在除ASCII以外的编码问题,这些问题已被详细记录: 此版本的csv模块不支持Unicode输入。也, 目前存在一些有关ASCII NUL字符的问题。 因此,所有输入应为UTF-8或可打印ASCII,以确保安全 在执行简单的读写操作时,可以使用来自的示例
UnicodeWriter
类
或者,您可以简化代码,从而:
import codecs
# ...
with codecs.open(r'C:\Users\L\Desktop\myfile.csv',
mode='w', encoding='utf-8') as outfile:
outfile.write('{}\n'.format(','.join(fields)))
for i in rows:
outfile.write('{}\n'.format(','.join(i)))
使用\
作为路径分隔符时,请使用原始字符串r'C:\Users\L\Desktop\myfile.csv'
。这是为了防止像'C:\newfile
这样的内容被错误地解释
您还可以使用正斜杠(即使在Windows中),这将消除使用原始字符串的需要
或者,您可以使用os.path.join
构建文件路径
关键是,避免使用
\
,因此我刚刚更改了Unicodesv的csv模块,它工作得非常好。以下是新代码:
import unicodecsv
import pandas as pd
from pygeocoder import Geocoder
from pygeocoder import GeocoderError
df = pd.read_csv('C:\Users\L\Desktop\germanfdiaddress.csv', encoding="iso-8859-1")
address = df.Address
print address
add=[]
lat=[]
lng=[]
pcode=[]
for a in address:
try:
result = Geocoder.geocode(a)
lat.extend([result[0].coordinates[0]])
lng.extend([result[0].coordinates[1]])
pcode.extend([result[0].postal_code])
except GeocoderError:
continue
fields= 'add','lat', 'lng', 'pcode'
rows=zip(address,lat,lng,pcode)
with open('C:\Users\L\Desktop\myfile.csv', 'wb') as outfile:
w = unicodecsv.writer(outfile, encoding='iso-8859-1')
w.writerow(fields)
for i in rows:
w.writerow(i)
要获得更清晰的Python外观,您可以在GitHub和PyPi上使用而不是pygeocoder,还可以处理Unicode问题。这真是太神奇了,您可以在DictWriter和DictReader中保持相同的外观,下面是一个代码示例:
import geocoder
import unicodecsv
import logging
# CSV Writer
csvfile = open('address_out.csv', 'wb')
fieldnames = ['source', 'address', 'lat', 'lng', 'postal']
writer = unicodecsv.DictWriter(csvfile, fieldnames=fieldnames, encoding='utf-8')
writer.writeheader()
# CSV Reader
with open('address.csv', 'rb') as f:
reader = unicodecsv.DictReader(f, encoding='iso-8859-1')
for line in reader:
address = line['Address']
# Geocoding
g = geocoder.google(address)
if g.ok:
row = {}
row['source'] = address
row['address'] = g.address
row['lat'] = g.lat
row['lng'] = g.lng
row['postal'] = g.postal
writer.writerow(row)
logging.info('Geocoding SUCCESS: ' + address)
else:
logging.warning('Geocoding ERROR: ' + address)
您需要使用
编解码器。打开
并设置要写入的文件的编码。感谢您的帮助。我最终使用了不同的方法,但拥有更多的选择总是好的。