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

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

14.1. csv — CSV ファイルの読み書き — Python 3.5.1 ドキュメント

例えば、 11,12,13,14 21,22,23,24 31,32,33,34

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

import csv

with open('data/src/sample.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
# ['11', '12', '13', '14']
# ['21', '22', '23', '24']
# ['31', '32', '33', '34']

ここで注意が必要なのが、コンマの後に空白(スペース)がある場合です。本来、コンマの後には不要な空白を入れるべきではないが、たまにスペースが入ってるファイルを見かけます。 そのような場合、デフォルトでは空白が無視されずそのまま読み込まれてしまいます。 11, 12, 13, 14 21, 22, 23, 24 31, 32, 33, 34

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

with open('data/src/sample_space.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
# ['11', ' 12', ' 13', ' 14']
# ['21', ' 22', ' 23', ' 24']
# ['31', ' 32', ' 33', ' 34']

と出力されます。 csv.readerでskipinitialspace=Trueと指定すると、コンマの後の空白がスキップされます。

with open('data/src/sample_space.csv', 'r') as f:
    reader = csv.reader(f, skipinitialspace=True)
    for row in reader:
        print(row)
# ['11', '12', '13', '14']
# ['21', '22', '23', '24']
# ['31', '32', '33', '34']

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

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

with open('data/src/sample_double_quotation.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
# ['one,one', ' "two', 'two"', ' "three', 'three"']

となってしまいます。 skipinitialspace=Trueとすると問題ありません。

with open('data/src/sample_double_quotation.csv', 'r') as f:
    reader = csv.reader(f, skipinitialspace=True)
    for row in reader:
        print(row)
# ['one,one', 'two,two', 'three,three']

pandasのread_csv()でcsvファイルを読むときも同じです。

コンマの後にスペースがあるcsvファイルの場合はread_csv(skipinitialspace=True)とします。

Last Updated: 6/26/2019, 10:34:03 PM