Pythonでコンマの後に空白があるcsvを読むときは注意
Pythonでは、標準のcsvモジュールを使ってcsvファイルを簡単に読み書きできる。
例えば、
11,12,13,14
21,22,23,24
31,32,33,34
source: sample.csv
という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']
source: csv_comma.py
ここで注意が必要なのが、コンマの後に空白(スペース)がある場合。本来、コンマの後には不要な空白を入れるべきではないが、たまにスペースが入ってるファイルを見かける。
そのような場合、デフォルトでは空白が無視されずそのまま読み込まれてしまう。
11, 12, 13, 14
21, 22, 23, 24
31, 32, 33, 34
source: sample_space.csv
という、コンマの後にスペースが入ったファイルを上のコードで読み込むと、
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']
source: csv_comma.py
と出力される。
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']
source: csv_comma.py
上のような簡単な例であればstrip()
で空白を消去してやってもいいが、問題は、次のようなダブルクオーテーションで囲まれている場合。
"one,one", "two,two", "three,three"
source: sample_double_quotation.csv
ダブルクオーテーションで囲まれている部分は一つの要素として見なしてほしいが、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"']
source: csv_comma.py
となってしまう。
skipinitialspace=True
とするとOK。
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']
source: csv_comma.py
pandasのread_csv()
でcsvファイルを読むときも同様。コンマの後にスペースがあるcsvファイルの場合はread_csv(skipinitialspace=True)
とする。