Pythonでコンマの後に空白があるcsvファイルを読むときは注意

Pythonでは、標準のcsvモジュールを使ってcsvファイルを簡単に読み書きできる。

例えば、

11,12,13
21,22,23
31,32,33

というsample.csvは以下のように読める。

import csv
with open('sample.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)
# 出力
['11', '12', '13']
['21', '22', '23']
['31', '32', '33']

ここで注意が必要なのが、コンマの後に空白(スペース)がある場合。本来、コンマの後には不要な空白を入れるべきではないが、たまにスペースが入ってるファイルを見かける。

そのような場合、デフォルトでは空白が無視されずそのまま読み込まれてしまう。

11, 12, 13
21, 22, 23
31, 32, 33

という、コンマの後にスペースが入ったファイルを上のコードで読み込むと、

# 出力
['11', ' 12', ' 13']
['21', ' 22', ' 23']
['31', ' 32', ' 33']

と出力される。

csv.readerskipinitialspace=Trueと指定すると、コンマの後の空白がスキップされる。

import csv
with open('sample.csv', newline='') as f:
# reader = csv.reader(f)
reader = csv.reader(f, skipinitialspace=True)
for row in reader:
print(row)
# 出力
['11', '12', '13']
['21', '22', '23']
['31', '32', '33']

上のような簡単な例であればstrip()で空白を消去してやってもいいが、問題は、次のようなダブルクオーテーションで囲まれている場合。

"one,one", "two,two", "three,three"

ダブルクオーテーションで囲まれている部分は一つの要素として見なしてほしいが、skipinitialspace=False(デフォルト)だと、

# 出力
['one,one', ' "two', 'two"', ' "three', 'three"']

となってしまう。

skipinitialspace=TrueとするとOK。

# 出力
['one,one', 'two,two', 'three,three']

pandasのread_csv()でcsvファイルを読むときも同様。コンマの後にスペースがあるcsvファイルの場合はread_csv(skipinitialspace=True)とする。

スポンサーリンク

関連記事