【问题标题】:runtime error with python dictionary while using defaultdict使用defaultdict时python字典的运行时错误
【发布时间】:2015-08-20 20:35:18
【问题描述】:

我正在使用字典在其中添加键和值。我正在检查密钥是否已经存在,如果是,我正在附加值;如果没有,我添加一个键和相应的值。

我收到错误消息:

AttributeError: 'str' 对象没有属性 'append'

这里是代码。我正在阅读一个 CSV 文件:

metastore_dir = collections.defaultdict(list)
with open(local_registry_file_path + data_ext_dt + "_metastore_metadata.csv",'rb') as metastore_metadata:
    for line in metastore_metadata: 
        key = line[2]
        key = key.lower().strip()
        if (key in metastore_dir):
            metastore_dir[key].append(line[0])
        else:
            metastore_dir[key] = line[0]

我找到了关于堆栈溢出的答案,它说使用 defaultdict 来解决问题,即使在建议的答案之后我也会收到错误消息。 我已经粘贴了我的代码以供参考。

【问题讨论】:

标签: python python-2.7 csv


【解决方案1】:

str 类型没有append() 方法。 将您对 append 的调用替换为 + 运算符:

sentry_dir[key] += line[1]

【讨论】:

  • 这个不行,key和value乱码
  • 你能举一个预期输入和输出的例子吗?
【解决方案2】:

它是一个字符串字典。要将其声明为列表,请使用

    if (key not in metastore_dir):  ## add key first if not in dict
        metastore_dir[key] = []  ## empty list
    metastore_dir[key].append(line[0])

    """ with defaultdict you don't have to add the key
        i.e. "if key in" not necessary
    """
    metastore_dir[key].append(line[0])

【讨论】:

  • 感谢您的回复
【解决方案3】:

当你在字典中插入一个新项目时,你想把它作为一个列表插入:

...
if (key in metastore_dir):
    metastore_dir[key].append(line[0])
else:
    metastore_dir[key] = [line[0]] # wrapping it in brackets creates a singleton list

在不相关的注释中,您似乎没有正确解析 CSV。尝试用逗号分隔每一行(例如,line.split(',')[2] 指的是 CSV 文件的第三列)。否则line[0] 指的是该行的第一个字符,line[2] 指的是该行的第三个字符,我怀疑这不是您想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    相关资源
    最近更新 更多