Một số tùy chọn:
(1) Thực hiện một cách chăm chỉ ánh xạ danh tính (tức là không làm gì) ra khỏi tên trường của bạn để csv.DictWriter có thể chuyển đổi nó trở lại danh sách và chuyển nó đến một phiên bản csv.writer.
(2) Tài liệu đề cập đến " writer
trường hợp cơ bản " ... vì vậy chỉ cần sử dụng nó (ví dụ ở cuối).
dw.writer.writerow(dw.fieldnames)
(3) Tránh chi phí csv.Dictwriter và tự mình làm điều đó với csv.writer
Ghi dữ liệu:
w.writerow([d[k] for k in fieldnames])
hoặc là
w.writerow([d.get(k, restval) for k in fieldnames])
Thay vì extrasaction
"chức năng", tôi muốn tự mình viết mã nó; bằng cách đó, bạn có thể báo cáo TẤT CẢ "tính năng bổ sung" với các khóa và giá trị, không chỉ khóa phụ đầu tiên. Một điều phiền toái thực sự với DictWriter là nếu bạn đã tự mình xác minh các khóa khi mỗi lệnh được xây dựng, bạn cần nhớ sử dụng extrasaction = 'ignore' nếu không nó sẽ CHẬM (tên trường là một danh sách), hãy lặp lại kiểm tra:
wrong_fields = [k for k in rowdict if k not in self.fieldnames]
============
>>> f = open('csvtest.csv', 'wb')
>>> import csv
>>> fns = 'foo bar zot'.split()
>>> dw = csv.DictWriter(f, fns, restval='Huh?')
# dw.writefieldnames(fns) -- no such animal
>>> dw.writerow(fns) # no such luck, it can't imagine what to do with a list
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\python26\lib\csv.py", line 144, in writerow
return self.writer.writerow(self._dict_to_list(rowdict))
File "C:\python26\lib\csv.py", line 141, in _dict_to_list
return [rowdict.get(key, self.restval) for key in self.fieldnames]
AttributeError: 'list' object has no attribute 'get'
>>> dir(dw)
['__doc__', '__init__', '__module__', '_dict_to_list', 'extrasaction', 'fieldnam
es', 'restval', 'writer', 'writerow', 'writerows']
# eureka
>>> dw.writer.writerow(dw.fieldnames)
>>> dw.writerow({'foo':'oof'})
>>> f.close()
>>> open('csvtest.csv', 'rb').read()
'foo,bar,zot\r\noof,Huh?,Huh?\r\n'
>>>
dw.writerow( dict((f,f) for f in dr.fieldnames) )
.