使用DictWriter写入字典部分键

23 投票
2 回答
18345 浏览
提问于 2025-04-16 01:01

我写了一个函数,用来把字典列表转成CSV文件,使用了csv模块,代码大概是这样的:

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

不过,有时候我只想把每个字典中的一部分键写入文件。如果我把字典中的一部分键作为fieldnames传进去,就会出现错误:

"dict contains fields not in fieldnames"

我该怎么做才能让DictRows只把我指定的字段写入CSV,而忽略那些在字典里但不在fieldnames中的字段呢?

2 个回答

0

对你的代码的修改:

别用Dictwriter,直接用普通的writer就行。

然后遍历你的字典列表:

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

如果你不想在字典中找不到某个字段时出现错误,可以用 d.get(fieldname, "") 代替 d[fieldname]

给匿名的点踩者一个提示:这其实是在做Alex的解决方案背后的工作(看看Lib/csv.py),而且做得更好一点…… csv.py会调用一个函数来获取列表中的每一行,而这个函数的核心内容是

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

最简单直接的方法是在初始化你的 DictWriter 实例时,传入 extrasaction='ignore',具体说明可以在这里找到:

如果你传给 writerow() 方法的字典里有一个键在字段名中找不到,额外的 extrasaction 参数就会决定该怎么处理。如果设置为 'raise',那么会抛出一个 ValueError 错误。如果设置为 'ignore',那么字典中的多余值就会被忽略。

这个方法同样适用于 writerows,因为它内部只是不断调用 writerow

撰写回答