【问题标题】:Too many values to unpack with python CSV reader and Geopy使用 python CSV 阅读器和 Geopy 解压的值太多
【发布时间】:2012-05-27 05:25:42
【问题描述】:
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 中的数据如下所示:

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

由于某种原因,我留下了“太多值无法解包”错误。如果我使用带注释的打印语句,这些值会打印出来。有谁知道为什么会这样?

【问题讨论】:

    标签: python csv geopy


    【解决方案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
    

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

    【讨论】:

      【解决方案2】:

      g.geocode() 返回嵌套元组(place, (lat, lng))列表。只需使用列表推导将其展平在单级元组(place, lat, lng)list 中 像这样更容易操作:

      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)
      

      【讨论】:

        猜你喜欢
        • 2018-06-05
        • 2015-01-17
        • 2015-09-04
        • 2017-11-25
        • 1970-01-01
        • 1970-01-01
        • 2014-05-03
        • 2015-03-05
        • 1970-01-01
        相关资源
        最近更新 更多