2012-05-27 2 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 выглядит следующим образом:Слишком много значений для распаковки с питоном CSV читателем и Geopy

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

По какой-то причине я оставил с «слишком много значений для распаковки» ошибки. Значения распечатываются, если я использую прокомментированный оператор печати. Кто-нибудь знает, почему это происходит?

ответ

1

Проблема: exactly_one аргумент g.geocode. Когда я запускаю это в оболочке я получаю:

>>> 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)