Pythonのcsvモジュールでreaderを使いたい

TAGS :

PythonのcsvモジュールでCSVファイルを読み込む

csv モジュールの DictReader の使用方法は ここ に書きました。

次は、reader オブジェクトの使用方法です。
reader のドキュメントは こちら です。

CSV ファイルを扱うときに出くわす問題は、文字コード問題区切り文字問題 です。
それぞれ見ていきます。

文字コード問題

誰かが日本語で作成した CSV ファイルの文字コードは、たいてい Shift-JIS になっています。
Python の csv モジュールで CSV ファイルを読み込む場合は、そのことをコードで教えてあげる必要があります。

CSVファイルを用意します。
CSVファイル

文字コードを指定せずに読み込むとエラーになります。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x95 in position 0: invalid start byte

Python


import os
import csv

filename = '日本語.csv'
file_path = os.path.join(os.getcwd(), filename)
f = open(file_path, 'r')
reader = csv.reader(f)
for row in reader:
    print(row)
f.close()

ファイルオープン時に文字コードを "shift-jis" を指定すると、正常に読み込めます。

Python


import os
import csv

filename = '日本語.csv'
file_path = os.path.join(os.getcwd(), filename)
f = open(file_path, 'r', encoding='sjis')
reader = csv.reader(f)
for row in reader:
    print(row)
f.close()

以下のように、各行がList型で取得できます。


['米国', '中国', '日本']
['東京都', '大阪府', '北海道']

区切り文字問題

CSVファイルは、多くは ", (カンマ)" で区切られていますが、たまに "半角スペース" や "タブ文字" で区切られていることがあります。

"半角スペース" 区切りの CSV ファイルを、区切り文字を指定せずに読み込むと、半角スペースを区切りとは認識しません。


['米国 中国 日本']
['東京都 大阪府 北海道']

delimiter パラメータを使って、delimiter=' ' で区切り文字を指定します。

Python


import os
import csv

filename = '日本語2.csv'
file_path = os.path.join(os.getcwd(), filename)
f = open(file_path, 'r', encoding='sjis')
reader = csv.reader(f, delimiter=' ')
for row in reader:
    print(row)
f.close()

区切り文字がタブの場合は、delimiter='\t' で区切り文字を指定します。

Python


import os
import csv

filename = '日本語3.csv'
file_path = os.path.join(os.getcwd(), filename)
f = open(file_path, 'r', encoding='sjis')
reader = csv.reader(f, delimiter='\t')
for row in reader:
    print(row)
f.close()

あと、試しに半角スペースを、delimiter='\s' で実装したら、エラーになってしまいました。
TypeError: "delimiter" must be a 1-character string
delimiterは1文字で指定 みたいな指摘ですが、バックスラッシュをエスケープ文字として認識していないのでしょうか。すいません。わかりませんでした。

Python


import os
import csv

filename = '日本語2.csv'
file_path = os.path.join(os.getcwd(), filename)
f = open(file_path, 'r', encoding='sjis')
reader = csv.reader(f, delimiter='\s')
for row in reader:
    print(row)
f.close()