Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python csv模块和pygeocoder出错_Python_Csv_Encoding_Geocoding - Fatal编程技术网

Python csv模块和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

我正在使用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 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)

您需要使用
编解码器。打开
并设置要写入的文件的编码。感谢您的帮助。我最终使用了不同的方法,但拥有更多的选择总是好的。