使用 DictWriter 写入字典键的子集

发布于 2024-09-08 21:51:47 字数 367 浏览 6 评论 0原文

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

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

但是,有时我只想将每个字典键的子集写入文件。如果我将每个字典具有的键的子集作为 fieldnames 传递,则会收到错误:

"dict contains fields not in fieldnames"

如何才能使 DictRows 只将我指定到 CSV 的字段的子集写入,而忽略这些字段字典中但不在字段名中的字段?

I wrote a function that serializes a list of dictionaries as a CSV file using the csv module, with code like this:

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

However, I sometimes want to write out to a file only a subset of each dictionary's keys. If I pass as fieldnames a subset of the keys that each dictionary has, I get the error:

"dict contains fields not in fieldnames"

How can I make it so that DictRows will write just a subset of the fields I specify to CSV, ignoring those fields that are in the dictionary but not in fieldnames?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

哀由 2024-09-15 21:51:47

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

如果字典传递给
writerow() 方法包含一个不包含的键
在字段名中找到,可选
extrasaction参数表示什么
采取的行动。如果设置为
'raise' 引发 ValueError。如果它
设置为'ignore',额外的值在
字典将被忽略。

它也适用于 writerows,它在内部只是重复调用 writerows。

Simplest and most direct approach is to pass extrasaction='ignore' when you initialize your DictWriter instance, as documented here:

If the dictionary passed to the
writerow() method contains a key not
found in fieldnames, the optional
extrasaction parameter indicates what
action to take. If it is set to
'raise' a ValueError is raised. If it
is set to 'ignore', extra values in
the dictionary are ignored.

It also works on writerows, which, internally, just calls writerow repeatedly.

只为一人 2024-09-15 21:51:47

更改代码:

忘记 Dictwriter,使用普通 writer。

然后循环遍历您的字典列表:

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

如果您不希望出现异常,请使用 d.get(fieldname, "") 而不是 d[fieldname] d 中的条目为 fieldname

匿名反对者请注意:这正在执行 Alex 的解决方案在幕后所做的事情(请参阅 Lib/csv.py),并且做得更好一点...... csv.py 调用一个函数来获取列表中的每一行,并且内部结构该函数的

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

Changes to your code:

Forget Dictwriter, use ordinary writer.

Then loop over your list of dicts:

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

Use d.get(fieldname, "") instead of d[fieldname] if you don't want an exception if there is no entry in d for a fieldname.

Note to anonymous downvoters: This is doing what Alex's solution is doing under the hood (see Lib/csv.py) and doing it a bit better ... csv.py calls a function to get each row in a list, and the guts of that function is

return [rowdict.get(key, self.restval) for key in self.fieldnames]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文