我编写了一个函数,使用csv
模块将字典列表序列化为CSV文件,代码如下:
data = csv.DictWriter(out_f, fieldnames)
data.writerows(dictrows)
但是,我有时想要只写出每个字典键的子集。如果我以fieldnames
传递每个字典所具有的键的子集,我会收到错误:
"dict contains fields not in fieldnames"
我怎样才能使DictRows只将我指定的字段的一部分写入CSV,忽略字典中但字段名中没有的字段?
答案 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}}