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

PythonのcsvモジュールのDictReaderの使用方法は以下の記事で書きました。

Pythonの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()