【问题标题】:Using DictWriter to write a subset of a dictionary's keys使用 DictWriter 编写字典键的子集
【发布时间】:2011-03-13 15:21:05
【问题描述】:

我使用csv 模块编写了一个将字典列表序列化为 CSV 文件的函数,代码如下:

data = csv.DictWriter(out_f, fieldnames)
data.writerows(dictrows)

但是,有时我只想将每个字典键的子集写入文件。如果我以fieldnames 的形式传递每个字典所具有的键的子集,则会收到错误消息:

"dict contains fields not in fieldnames"

如何使 DictRows 仅将我指定的字段的子集写入 CSV,而忽略字典中但不在字段名中的那些字段?

【问题讨论】:

    标签: python csv dictionary


    【解决方案1】:

    最简单和最直接的方法是在初始化DictWriter 实例时传递extrasaction='ignore',如here 所述:

    如果字典传递给 writerow() 方法包含一个键不 在字段名中找到,可选 extrasaction 参数表示什么 采取的行动。如果设置为 'raise' ValueError 被提出。如果它 设置为'ignore',额外的值在 字典被忽略了。

    它也适用于writerows,它在内部只是重复调用writerow

    【讨论】:

    • 未找到字典键的选项 restval 与 extrasaction='ignore' 一起特别有用。
    • 提醒一下,关键子集看起来像['lat', 'lng']
    【解决方案2】:

    对代码的更改:

    忘掉Dictwriter,用普通的writer。

    然后遍历你的字典列表:

    for d in dictrows:
        ordinary_writer.writerow([d[fieldname] for fieldname in fieldnames])
    

    如果d 中没有fieldname 的条目,如果您不希望出现异常,请使用d.get(fieldname, "") 而不是d[fieldname]

    匿名投票者请注意:这是 Alex 的解决方案在幕后所做的(参见 Lib/csv.py)并且做得更好...... csv.py 调用一个函数来获取列表中的每一行,这个函数的核心是

    return [rowdict.get(key, self.restval) for key in self.fieldnames]
    

    【讨论】:

    • -1;当DictWriter 提供了一个方便的参数来自动解决问题时,没有理由这样做,如 Alex 的回答中所述。
    猜你喜欢
    • 1970-01-01
    • 2016-05-31
    • 2015-01-02
    • 2016-04-22
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多