2013-01-04 62 views
41

प्रसंस्करण CSV फ़ाइलों csv.DictReader में # के साथ चिह्नित महान है - लेकिन मैं में (एक लाइन के शुरू में एक हैश द्वारा इंगित), उदाहरण के लिए टिप्पणी लाइनों के साथ CSV फ़ाइलों है:पायथन: छोड़ टिप्पणी लाइनों <a href="http://docs.python.org/2/library/csv.html#csv.DictReader">csv.DictReader</a> साथ

 
# step size=1.61853 
val0,val1,val2,hybridisation,temp,smattr 
0.206895,0.797923,0.202077,0.631199,0.368801,0.311052,0.688948,0.597237,0.402763 
-169.32,1,1.61853,2.04069e-92,1,0.000906546,0.999093,0.241356,0.758644,0.202382 
# adaptation finished 

सीएसवी मॉड्यूल doesn't include any way to skip such lines

मैं आसानी से कुछ हैकी कर सकता था, लेकिन मुझे लगता है कि कुछ अन्य इटरेटर ऑब्जेक्ट के आस-पास एक csv.DicReader को लपेटने का एक अच्छा तरीका है, जो लाइनों को त्यागने के लिए पूर्वप्रवाह है।

उत्तर

59

वास्तव में इस filter के साथ अच्छी तरह से काम करता है:

import csv 
fp = open('samples.csv') 
rdr = csv.DictReader(filter(lambda row: row[0]!='#', fp)) 
for row in rdr: 
    print(row) 
fp.close() 
+15

कि स्मृति में पूरी फ़ाइल पढ़ा जाएगा। यदि यह बहुत बड़ा नहीं है तो कोई समस्या नहीं है, अन्यथा आप जनरेटर अभिव्यक्ति या 'itertools.ifilter() 'का उपयोग करना चाहेंगे। – Duncan

+29

... या जनरेटर अभिव्यक्ति: 'csv.DictReader (पंक्ति में पंक्ति के लिए पंक्ति अगर row.startswith ('#') नहीं है)' –

+0

@ Pyunon3.6 में itertools की आवश्यकता नहीं है, 'फ़िल्टर() के रूप में 'डिफ़ॉल्ट रूप से एक इटरेटर वापस कर देगा, इसलिए फ़ाइल को स्मृति में लोड नहीं किया जाएगा। –