使用DictWriter编写字典键的子集

时间:2010-07-08 23:46:33

标签: python csv dictionary

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

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

但是,我有时想要只写出每个字典键的子集。如果我以fieldnames传递每个字典所具有的键的子集,我会收到错误:

"dict contains fields not in fieldnames"

我怎样才能使DictRows只将我指定的字段的一部分写入CSV,忽略字典中但字段名中没有的字段?

2 个答案:

答案 0 :(得分:37)

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

  

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

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

答案 1 :(得分:1)

您的代码更改:

忘记Dictwriter,使用普通作家。

然后遍历你的词典列表:

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

如果d.get(fieldname, "") d[fieldname]中没有d条目,则使用fieldname而不是return [rowdict.get(key, self.restval) for key in self.fieldnames]

匿名downvoters注意:这正在做Alex的解决方案在幕后做的事情(参见Lib / csv.py)并做得更好...... csv.py调用一个函数来获取列表中的每一行,而这个功能的内涵是

{{1}}