2012-05-27 32 views
0
import csv 
from geopy import geocoders 

g = geocoders.Google() 

spamReader = csv.reader(open('locations.csv', 'rb'), delimiter='\t', quotechar='|') 

for row in spamReader: 
    a = ', '.join(row) 
    #print a 
    place, (lat, lng) = g.geocode(a, exactly_one=False) 
    print "%s: %.5f, %.5f" % (place, lat, lng) 

里面的数据locations.csv样子:值过多拆封使用Python CSV阅读器和Geopy

6943  Australia 
6944  Australia 
6945  Australia 
6946  Australia 
6947  Australia 
6951  Australia 

出于某种原因,我留下了一个“值过多解压”的错误。如果我使用注释的打印语句,这些值会打印出来。有谁知道为什么会发生这种情况?

回答

1

问题出在g.geocodeexactly_one参数。当我在shell中运行此我得到:

>>> g.geocode('6943, Australia', exactly_one=False) 
[(u'Australia 6943, Villafontana, Tijuana Municipality, Baja California, Mexico', 
    (32.4988788, -116.8620506)), 
(u'Australia 6943, Castelar, Buenos Aires Province, Argentina', 
    (-34.7036339, -58.6423071)), 
(u'Australia 6943, Rosario, Santa Fe Province, Argentina', 
    (-32.9913482, -60.6398934)), 
(u'Australia, Lebanon', (33.8879118, 35.4749439)), 
(u'Australia, Juliaca, Peru', (-15.4897806, -70.146677)), 
(u'Australia, Lima District 15007, Peru', (-12.0397296, -76.9944836)), 
(u'Australia, Manila, Philippines', (14.48538, 121.0394822)), 
(u'Australia, Conchal\xed, Santiago Metropolitan Region, Chile', 
    (-33.3929606, -70.6780826)), 
(u'Australia, Chiguayante, Biob\xedo Region, Chile', 
    (-36.9556346, -73.0145556)), 
(u'Australia, Copiap\xf3, Atacama Region, Chile', (-27.3978776, -70.2934656))] 

现在,你想分手是大名单逼到place, (lat, lng),当它实际上是人的名单;有too many values在该列表中to unpack逼到两个(place(lat, lng)),因为实际上有10.你可以做类似

for place, (lat, lng) in g.geocode(a, exactly_one=False): 
    print place, lat, lng 

或做一些其他类型的列表操作或什么的。

1

g.geocode()返回一个列表的嵌套元组(place, (lat, lng))。只需使用列表理解压扁它在单级的列表元组(place, lat, lng)为 更容易操作是这样的:

data = ((place, lat, lng) for place, (lat, lng) in g.geocode(a, exactly_one=False)) 
print "\n".join("%s: %.5f, %.5f" % t for t in data)