몇 가지 옵션 :
(1) csv.DictWriter가 목록으로 다시 변환하여 csv.writer 인스턴스로 전달할 수 있도록 필드 이름에서 신원 매핑 (즉, 아무것도하지 않음)을 지정합니다.
(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의 진짜 불쾌한 점은 각 dict이 만들어 질 때 열쇠를 직접 확인했다면 extrasaction = 'ignore'를 사용하는 것을 잊지 말아야한다는 것입니다. 그렇지 않으면 SLOWLY로 이동합니다 (fieldnames는 목록입니다).
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'
>>>
+1 헤더를 쓰는 또 다른 방법은 다음과 같습니다.'dw.writerow (dr.fieldnames에서 fict에 대한 dict (f, f))'. – FMc
@ Adam : 짧은 한 줄짜리는 내 대답을 참조하십시오. –
@ John : 대답에 +1; 간단히 "근원적 인 작가의 실례 (instance)"를 이용하는 것은 "힘든 신원 매핑"보다 바람직하다. – bernie