PythonのcsvモジュールでCSVファイルを読み込む
csv モジュールの DictReader の使用方法は ここ に書きました。
次は、reader オブジェクトの使用方法です。
reader のドキュメントは こちら です。
CSV ファイルを扱うときに出くわす問題は、文字コード問題 と 区切り文字問題 です。
それぞれ見ていきます。
文字コード問題
誰かが日本語で作成した CSV ファイルの文字コードは、たいてい Shift-JIS になっています。
Python の csv モジュールで CSV ファイルを読み込む場合は、そのことをコードで教えてあげる必要があります。
CSVファイルを用意します。
文字コードを指定せずに読み込むとエラーになります。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x95 in position 0: invalid start byte
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" を指定すると、正常に読み込めます。
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=' ' で区切り文字を指定します。
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' で区切り文字を指定します。
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文字で指定 みたいな指摘ですが、バックスラッシュをエスケープ文字として認識していないのでしょうか。すいません。わかりませんでした。
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()