使用DictWriter写入字典部分键
我写了一个函数,用来把字典列表转成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
。