开发者

Using DictWriter to write a subset of a dictionary's keys

开发者 https://www.devze.com 2023-01-06 23:32 出处:网络
I wrote a function that serializes a list of dictionaries as a CSV file using the csv module, with code like this:

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(dictrow开发者_开发问答s)

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?


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.


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]
0

精彩评论

暂无评论...
验证码 换一张
取 消