몇 가지 옵션 :
(1) csv.DictWriter가 목록으로 다시 변환하여 csv.writer 인스턴스로 전달할 수 있도록 필드 이름에서 ID 매핑 (즉, 아무것도하지 않음) dict를 열심히 만듭니다.
(2) 문서에 "기본 writer
인스턴스"가 언급 되어 있으므로 사용하십시오 (마지막의 예).
dw.writer.writerow(dw.fieldnames)
(3) csv.Dictwriter 오버 헤드를 피하고 csv.writer로 직접 수행
데이터 쓰기 :
w.writerow([d[k] for k in fieldnames])
또는
w.writerow([d.get(k, restval) for k in fieldnames])
extrasaction
"기능" 대신에 직접 코딩하는 것을 선호합니다. 이렇게하면 첫 번째 추가 키뿐 아니라 키와 값으로 모든 "추가"를보고 할 수 있습니다. DictWriter의 실제 성가신 점은 각 딕셔너리가 빌드 될 때 키를 직접 확인했다면 extrasaction = 'ignore'를 사용하는 것을 기억해야한다는 것입니다.
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) )
.