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