使用 DictWriter 编写字典键的子集

Posted

技术标签:

【中文标题】使用 DictWriter 编写字典键的子集【英文标题】:Using DictWriter to write a subset of a dictionary's keys 【发布时间】: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,而忽略字典中但不在字段名中的那些字段?

【问题讨论】:

【参考方案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 的回答中所述。

以上是关于使用 DictWriter 编写字典键的子集的主要内容,如果未能解决你的问题,请参考以下文章

字典键的交集是啥

当行内容是相关键的键值(每列的标题)时,如何用python在csv中编写嵌套字典?

如何仅针对键的子集有效地比较 C++ 中的两个字符串映射

子集生成与字典序

如何在字典中提取特定值(仅包含其键的值)

从 csv 文件创建字典?