2013-01-04 55 views
41

處理具有csv.DictReader的CSV文件非常棒 - 但我有註釋行(在行首以散列表示)中的CSV文件,例如:Python:在csv.DictReader中跳過標註#的註釋行

 
# 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 

csv模塊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 for fp if row.startswith('#'))' –

+0

@Duncan不需要Python3.6中的itertools,因爲'filter() '會默認返回一個迭代器,因此該文件不會被加載到內存中。 –