2010-07-08 25 views
9

tôi đã viết một hàm serializes một danh sách các từ điển dưới dạng tệp CSV bằng cách sử dụng mô-đun csv, với mã như thế này:Sử dụng DictWriter để viết một tập hợp con của các phím của một từ điển

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

Tuy nhiên, đôi khi tôi muốn chỉ ghi vào một tệp tin một tập con của mỗi khóa của từ điển. Nếu tôi vượt qua như fieldnames một tập hợp con của các phím mà mỗi từ điển có, tôi nhận được lỗi:

"dict contains fields not in fieldnames" 

Làm thế nào tôi có thể làm cho nó để DictRows sẽ viết chỉ là một tập hợp con của các lĩnh vực tôi chỉ định để CSV, bỏ qua những các trường có trong từ điển nhưng không có trong tên trường?

Trả lời

33

đơn giản nhất và trực tiếp nhất phương pháp là phải vượt qua extrasaction='ignore' khi bạn khởi DictWriter dụ của bạn, như tài liệu 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.

Nó cũng hoạt động trên writerows, trong đó, nội bộ, chỉ cần gọi writerow lặp đi lặp lại.

+1

Tùy chọn khôi phục cho khóa từ điển không tìm thấy có ích hữu ích cùng với extrasaction = 'ignore'. – Gregor

1

Thay đổi mã của bạn:

Hãy quên ghi chú, sử dụng văn bản thông thường.

Sau đó lặp trên danh sách các dicts:

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

Sử dụng d.get(fieldname, "") thay vì d[fieldname] nếu bạn không muốn một ngoại lệ nếu không có mục trong d cho một fieldname.

Lưu ý đối với người đánh giá ẩn danh: Điều này đang làm những gì giải pháp của Alex đang thực hiện dưới mui xe (xem Lib/csv.py) và làm tốt hơn một chút ... csv.py gọi một hàm để có được mỗi hàng trong danh sách và các đường ruột của chức năng đó là

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

-1; không có lý do để làm điều này khi 'DictWriter' cung cấp một tham số thuận tiện để giải quyết vấn đề một cách tự động, như được mô tả trong câu trả lời của Alex. –

Các vấn đề liên quan