81

csv.DictReaderでCSV ファイルを処理するのは素晴らしいことですが、コメント行 (行頭のハッシュで示される) を含む CSV ファイルがあります。次に例を示します。

# 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 モジュールには、そのような行をスキップする方法は含まれていません

私は簡単にハッキーなことをすることができましたがcsv.DictReader、行を破棄するために前処理する他の反復子オブジェクトをラップする良い方法があると思います。

4

4 に答える 4

104

実際、これは次の場合にうまく機能しfilterます。

import csv
fp = open('samples.csv')
rdr = csv.DictReader(filter(lambda row: row[0]!='#', fp))
for row in rdr:
    print(row)
fp.close()
于 2013-01-04T14:20:30.043 に答える
22

良い質問。Python の CSV ライブラリには、コメントの基本的なサポートがありません (CSV ファイルの上部では珍しくありません)。Dan StowellのソリューションはOPの特定のケースで機能し#ますが、最初のシンボルとして表示する必要があるという点で制限されています。より一般的な解決策は次のとおりです。

def decomment(csvfile):
    for row in csvfile:
        raw = row.split('#')[0].strip()
        if raw: yield raw

with open('dummy.csv') as csvfile:
    reader = csv.reader(decomment(csvfile))
    for row in reader:
        print(row)

例として、次のdummy.csvファイル:

# comment
 # comment
a,b,c # comment
1,2,3
10,20,30
# comment

戻り値

['a', 'b', 'c']
['1', '2', '3']
['10', '20', '30']

もちろん、これは と同様に機能しcsv.DictReader()ます。

于 2018-05-29T20:13:20.680 に答える