ตัวเลือกบางอย่าง:
(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 ก็คือหากคุณได้ตรวจสอบคีย์ด้วยตัวเองในขณะที่สร้างคำสั่งแต่ละตัวคุณต้องจำไว้ว่าให้ใช้ความพิเศษ = 'ไม่สนใจ' มิฉะนั้นจะช้าลง (ชื่อฟิลด์คือรายการ) ทำเครื่องหมายซ้ำ:
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) )
.