【问题标题】:error: 'str' object does not support item assignment in python错误:“str”对象不支持 python 中的项目分配
【发布时间】:2016-03-10 16:52:25
【问题描述】:

我正在尝试通过使用从 github 下载的一些代码来使用 geopy 对地址进行地理编码。 但是代码的错误是str obj不支持geocode_addresses address_dict["error"] = ""中的项目分配? 为什么我会收到这个错误。下面是代码。

if __name__ == '__main__':
    csv_file = 'nr-fixedNew.csv'
    with open(csv_file, 'rb') as csvfile:
        for row in csvfile.readlines():
            df = pd.read_csv(csv_file)
            address = df.ADDRESS
            geocoded = geocode_addresses(address)
            write_csv(output_file, geocoded)


    def geocode_addresses(address_dicts):
        geocoder = geocoders.GoogleV3()
        for address_dict in address_dicts:
            address_dict["error"] = ""
            try:
                time.sleep(1)
                address, (lat, lon) = geocoder.geocode(address_dict["fulladdress"])
                address_dict["fulladdress"] = address
                address_dict["latitude"] = lat
                address_dict["longitude"] = lon
            except ValueError as e:
                address_dict["error"] = e
        return address_dicts

数据集示例

SEX,PROGRAMME,ADDRESS
M,2,"J6855, JALAN LMBAH KESANG 1/1-3,77378 MERLIMAU, MELAKA";

【问题讨论】:

  • 请提供更多细节,具体来说,address_dict。大概是dict,但错误提示并非如此。
  • address_dict 似乎是 str - 这意味着您需要查看调用 geocode_addresses 的代码,以找出为什么它是字符串的可迭代对象。
  • 你能提供一个示例数据集吗?
  • @mgilson 编辑了问题
  • @AmiTavory -- s['bar'] 呼叫 __getitem__s['bar'] = '' 呼叫 __setitem__。因为str 是不可变的,所以__setitem__ 无论你传入什么都会失败,所以没有理由去检查类型。对于intlong 或适当的slice__getitem__ 将成功,因此需要进行一些类型检查,并可用于帮助格式化错误消息。

标签: python geopy


【解决方案1】:

这里看起来像下面sn-p中的address/df.ADDRESS

    address = df.ADDRESS
    geocoded = geocode_addresses(address)

address 不是您期望的字典列表:

for address_dict in address_dicts:
    address_dict["error"] = ""

测试您的代码后,address_dicts 是:

(<class 'pandas.core.series.Series'>

这基本上是一个 (pandas) 字符串列表:

(Pdb) address_dicts
0    J6855, JALAN LMBAH KESANG 1/1-3,77378 MERLIMAU...
Name: ADDRESS, dtype: object
(Pdb) address_dicts[0]
'J6855, JALAN LMBAH KESANG 1/1-3,77378 MERLIMAU, MELAKA;'

所以您的问题与您解析 CSV 文件的方式有关。


还有,我真的不明白你在这里要做什么:

with open(csv_file, 'rb') as csvfile:
    for row in csvfile.readlines():
        df = pd.read_csv(csv_file)

所以您打开文件,然后遍历文件,并且对于每一行,您都将文件解析为 csv?!


if __name__ == '__main__':
    csv_file = 'nr-fixedNew.csv'
    with open(csv_file, 'rb') as csvfile:
            df = pd.read_csv(csv_file).to_dict() ### here you convert to dict
            address = df['ADDRESS']
            geocoded = geocode_addresses(address)
            write_csv(output_file, geocoded)

然后您需要重新考虑解析值的方式。不要犹豫调用 pdb 或添加打印输出。

【讨论】:

  • 我正在尝试打开文件,读取每一行并获取要传递给 geocode_addresses 的地址字段。我不熟悉python,我不知道这两行都是为了打开文件
  • 原始代码最初用于输入文件,其中只有地址。
  • 我收到新错误。 geocode_addresses address_dict["error"] = "" TypeError: 'numpy.int64' object does not support item assignment
  • 这意味着你又搞砸了,你的address_dict 充满了ints。当您遇到问题时,查找引发异常的行,并尝试添加有罪对象的print()(如您的情况下的print(address_dict))。此外,您可以通过在中断打开命令行 python 进行调试的行之前添加import pdb; pdb.set_trace() # XXX BREAKPOINT 来启动调试器。
  • 另外,如果您对代码有更多疑问,请创建一个新问题!因为问题是免费的,而且我并不总是在身边,所以你会给别人一个机会来帮助你。
猜你喜欢
  • 2015-12-22
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
相关资源
最近更新 更多