アイキャッチ画像

PythonでCSVのデータの頭のスペースを削除しながら読み込む

PythonでCSVのデータを読み込むときに、データの頭のスペースを読まないようにしてみました。

目次

  1. 厳密には区切り文字の前後のスペースはデータです
  2. stripを使ってデータ前後のスペースを削除する
  3. ファイルを読み込むと同時にスペースを削除する

厳密には区切り文字の前後のスペースはデータです

CSVの規約に厳密に従うと、区切り文字の前後のスペースはデータの一部です。

とはいえ、カンマと次のデータの間にスペースを入れたいというのが人情です。人間の目にはカンマだけでデータを区切るというのはつらいのです。

Pythonのcsvモジュールは律儀なので、こういうデータを読むとスペースもデータとして認識します。

111,222 , 333,       444,   555

わかりにくいですが、222の後にスペースが、333の前にスペースが、444の前にタブが、555の前にスペース3個があります。

これをこんなスクリプトで読んでみます

import csv

with open('test.csv', mode='r', newline='', encoding='utf-8') as f:
    csv_reader = csv.reader(f)
    read_data = [row for row in csv_reader]

print(read_data)

出力はこうなります。

[['111', '222 ', ' 333', '\t444', '   555']]

スペースがデータの一部になってますね。

stripを使ってデータ前後のスペースを削除する

stripメソッドでデータの前後のスペースを取り除いてみます。

import csv

with open('test.csv', mode='r', newline='', encoding='utf-8') as f:
    csv_reader = csv.reader(f)
    read_data = [row for row in csv_reader]

stripped_data = []
for d in read_data[0]:
    stripped_data.append(d.strip(' '))

print(stripped_data)

出力はこうなります。

['111', '222', '333', '\t444', '555']

タブ以外は削除できました。もう一度タブ文字を指定してstripするか、正規表現を使って空文字に変換してしまえば良いと思います。

ファイルを読み込むと同時にスペースを削除する

例えば、スペースはカンマの後ろにしか入っていないしタブ文字は使わないというのがわかっているCSVデータもあります。データロガーの出力とかですね。

そういうCSVデータの場合は、いちいちstripするのは面倒です。

csvモジュールでも、readerオブジェクトを作る際のskipinitialspace引数にTrueを指定すると、データの頭のスペースを削除してくれます。

import csv

with open('test.csv', mode='r', newline='', encoding='utf-8') as f:
    csv_reader = csv.reader(f, skipinitialspace=True)
    read_data = [row for row in csv_reader]

print(read_data)

csv.readerのところにskipinitialspaceが指定してありますね。

出力はこうなります。

[['111', '222 ', '333', '\t444', '555']]

タブは消してくれませんでしたし、データの後ろのスペースも消されませんが、頭のスペースは消されています。

広告

PythonでCSVカテゴリの投稿