web-dev-qa-db-ja.com

Python:csv.DictReaderで#のマークが付いたコメント行をスキップします

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

#ステップサイズ= 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 
#適応完了

Csvモジュール そのような行をスキップする方法は含まれていません

簡単にハッキングを行うことはできますが、csv.DicReaderを他のイテレーターオブジェクトの周りにラップして、行を破棄する前処理を行う素敵な方法があると思います。

60
Dan Stowell

実際、これはfilterでうまく機能します:

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

良い質問です。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()でも同様に機能します。

5
sigvaldm

CSVファイルを読み取る別の方法は、pandasを使用することです

サンプルコードを次に示します。

df = pd.read_csv('test.csv',
                 sep=',',     # field separator
                 comment='#', # comment
                 index_col=0, # number or label of index column
                 skipinitialspace=True,
                 skip_blank_lines=True,
                 error_bad_lines=False,
                 warn_bad_lines=True
                 ).sort_index()
print(df)
df.fillna('no value', inplace=True) # replace NaN with 'no value'
print(df)

このcsvファイルの場合:

a,b,c,d,e
1,,16,,55#,,65##77
8,77,77,,16#86,18#
#This is a comment
13,19,25,28,82

次の出力が得られます。

       b   c     d   e
a                     
1    NaN  16   NaN  55
8   77.0  77   NaN  16
13  19.0  25  28.0  82
           b   c         d   e
a                             
1   no value  16  no value  55
8         77  77  no value  16
13        19  25        28  82
2
Granny Aching