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を他のイテレーターオブジェクトの周りにラップして、行を破棄する前処理を行う素敵な方法があると思います。
実際、これはfilter
でうまく機能します:
import csv
fp = open('samples.csv')
rdr = csv.DictReader(filter(lambda row: row[0]!='#', fp))
for row in rdr:
print(row)
fp.close()
良い質問です。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()
でも同様に機能します。
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