使用 DictWriter 编写字典键的子集
Posted
技术标签:
【中文标题】使用 DictWriter 编写字典键的子集【英文标题】:Using DictWriter to write a subset of a dictionary's keys 【发布时间】:2011-03-13 15:21:05 【问题描述】:我使用csv
模块编写了一个将字典列表序列化为 CSV 文件的函数,代码如下:
data = csv.DictWriter(out_f, fieldnames)
data.writerows(dictrows)
但是,有时我只想将每个字典键的子集写入文件。如果我以fieldnames
的形式传递每个字典所具有的键的子集,则会收到错误消息:
"dict contains fields not in fieldnames"
如何使 DictRows 仅将我指定的字段的子集写入 CSV,而忽略字典中但不在字段名中的那些字段?
【问题讨论】:
【参考方案1】:最简单和最直接的方法是在初始化DictWriter
实例时传递extrasaction='ignore'
,如here 所述:
如果字典传递给
writerow()
方法包含一个键不 在字段名中找到,可选 extrasaction 参数表示什么 采取的行动。如果设置为'raise'
ValueError
被提出。如果它 设置为'ignore'
,额外的值在 字典被忽略了。
它也适用于writerows
,它在内部只是重复调用writerow
。
【讨论】:
未找到字典键的选项 restval 与 extrasaction='ignore' 一起特别有用。 提醒一下,关键子集看起来像['lat', 'lng']
。【参考方案2】:
对代码的更改:
忘掉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;当DictWriter
提供了一个方便的参数来自动解决问题时,没有理由这样做,如 Alex 的回答中所述。以上是关于使用 DictWriter 编写字典键的子集的主要内容,如果未能解决你的问题,请参考以下文章