使用DictWriter编写字典子集的键

21

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

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

然而,有时我只想将每个字典的一个子集写入文件。如果我将fieldnames作为每个字典拥有的键的子集传递,那么会出现错误:

"dict contains fields not in fieldnames"
我该如何使DictRows仅将我指定的字段子集写入CSV,忽略那些在字典中但不在fieldnames中的字段?
2个回答

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

如果传递给 writerow() 方法的字典包含一个在 fieldnames 中未找到的键,则可选的 extrasaction 参数指示采取什么操作。如果它设置为 'raise',将引发 ValueError。 如果它设置为 'ignore',则会忽略字典中的额外值。

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

1
选项restval对于未找到字典键特别有用,尤其是与extrasaction='ignore'一起使用。 - Gregor
提醒一下,关键子集看起来像 ['lat', 'lng'] - Alfred Wallace

0

你的代码变更:

忘记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
-1;当DictWriter提供了一个方便的参数来自动解决这个问题时,没有理由这样做,就像Alex的回答中所描述的那样。 - Mark Amery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接