2010-07-08 15 views
9

मैं इस तरह कोड के साथ एक समारोह है कि csv मॉड्यूल का उपयोग कर एक CSV फ़ाइल के रूप शब्दकोशों की एक सूची को धारावाहिक लिखा DictWriter का उपयोग करना:एक शब्दकोश की कुंजियों की एक सबसेट लिखने के

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

हालांकि, मैं कभी कभी करना चाहते हैं फ़ाइल को प्रत्येक शब्दकोष की केवल एक सबसेट के लिए लिखें। मैं इसे कैसे कर सकते हैं ताकि DictRows क्षेत्रों के केवल एक सबसेट मैं सीएसवी करने के लिए निर्दिष्ट लिखेंगे, उन अनदेखी

"dict contains fields not in fieldnames" 

: यदि मैं fieldnames के रूप में कुंजी है कि प्रत्येक शब्दकोश के एक सबसेट गुजरती हैं, मैं त्रुटि मिलती है फ़ील्ड जो शब्दकोश में हैं लेकिन फ़ील्डनाम में नहीं हैं?

उत्तर

33

सरल और सबसे सीधा रास्ता के रूप में दस्तावेज hereextrasaction='ignore' पारित करने के लिए जब आप अपने DictWriter उदाहरण प्रारंभ, है:

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.

यह भी writerows, जो आंतरिक रूप से, बस writerow बार-बार कहता है पर काम करता है।

+1

शब्दकोश कुंजी नहीं मिला के लिए विकल्प पुनर्विक्रय extrasaction = 'ignore' के साथ एक साथ उपयोगी है। – Gregor

1

अपने कोड में परिवर्तन:

भूल जाओ Dictwriter, साधारण लेखक का उपयोग करें।

फिर dicts की अपनी सूची से अधिक पाश:

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

उपयोग d.get(fieldname, "") बजाय d[fieldname] आप एक अपवाद नहीं करना चाहते हैं, अगर वहाँ एक fieldname के लिए d में कोई प्रविष्टि नहीं है।

गुमनाम डाउनवॉटर पर ध्यान दें: यह वही कर रहा है जो एलेक्स का समाधान हुड के नीचे कर रहा है (लीब/सीएसवीटीवी देखें) और इसे थोड़ा बेहतर कर रहा है ... csv.py प्रत्येक पंक्ति को सूची में प्राप्त करने के लिए एक फ़ंक्शन कॉल करता है , और उस फ़ंक्शन की गड़बड़ी

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

-1; ऐसा करने का कोई कारण नहीं है जब 'डिक्टवाइटर' स्वचालित रूप से समस्या को हल करने के लिए एक सुविधाजनक पैरामीटर प्रदान करता है, जैसा कि एलेक्स के उत्तर में वर्णित है। –

संबंधित मुद्दे