日本語を含むcsvファイルを読み込む場合は、encoding='shift_jis'
を指定して、pd.read_csv('data.csv', encoding='shift_jis')
と書くのは定石です。
しかし、それでもエラーとなってしまう場合があります。
例えば、以下のようなcsvファイルです。
# 例1: 'shift_jis'でエラーとなる
clm0 clm1 clm2 clm3
1 Ⅰ APPLE りんご
2 Ⅱ apple リンゴ
3 Ⅲ aPPLe リンゴ
4 Ⅳ Apple 林檎
どれも日本語と英語のように見えますが、'shift_jis'
ではエラーとなります。
しかし、以下は 'shift_jis'
で読み込めます。
# 例2: 'shift_jis'でエラーとならない
clm0 clm1 clm2 clm3
1 I APPLE りんご
2 II apple リンゴ
3 III aPPLe リンゴ
4 IV Apple 林檎
何が違うのでしょうか?そしてどうすればいいのでしょうか?
ここでは、もとのcsvファイルを確認しても、おかしい部分が見当たらず、「何がおかしいの!(怒)」、という場面で対処する方法を説明します。上の2つの例が、大きなヒントとなります。
これを知っておくと、大きな時間短縮になります。
#トピック
- 原因
- 対処方法
- 他にどんなencodingがあるか
- 参考ページ
https://shilabo.com/python/web_self/a001_000/a001_001/
#原因
多くの場合、ファイルの中の日本語の文字が原因です。
例えば、以下の2つの文字をご覧ください。
文字1: Ⅰ, Ⅱ, Ⅲ, Ⅳ
文字2: I, II, III, IV
文字1は日本語です。1とタイプして全角変換したものです。2,3,4も同様です。環境依存文字と出てくるのではないでしょうか。
文字2は英語です。I(英大文字のアイ)とV(英大文字のヴィ)の組み合わせです。
文字1のような日本語が含まれていると、'shift_jis'
では読み込めません。
他に、①, ②, ③ (1,2,3とタイプして全角で変換)も文字1と同じ扱いで、読み込めません。
#対処方法
元のファイルを見て、どう見ても日本語と英語であり、上記が原因であれば、以下で対処できます。
encoding='cp932'
を指定します。
つまり、
df = pd.read_csv('data.csv', encoding='cp932')
print(df)
と書きます。これで①,②,③といった文字も読み込み可能です。
# clm0 clm1 clm2 clm3
#0 1 ① APPLE りんご
#1 2 ② apple リンゴ
#2 3 ③ aPPLe リンゴ
#3 4 ④ Apple 林檎
但し、一番いいのは、'shift_jis'で読み込めないような文字は使わない(日本語変換する①やⅣなどは使わない)ことです。或るは、日本語を一切使わず英語だけにするのが一番いいです。Pythonは日本語が苦手です。
しかし、現実には、会社の共有ファイルでは、過去に作成された「見せるための」(分析のためではない)ファイルからデータを抽出する必要も多々あるでしょう。
encoding=shifut_jis
でうまくいかない場合は、encoding='cp932'
で対処を試みてください。
#他にどんなencodingがあるか
以下のPyhonのドキュメント(英語)を調べると、日本語に関しては次のものが用意されてます。(リストをJapaneseでフィルター)
https://docs.python.org/3/library/codecs.html#standard-encodings
しかし、実際には、普通は'shift_jis'
を使い、うまくいかない場合は'cp932'を試してみる、程度です。
それ以外は使いません。(少なくとも筆者は使った事がありません)
#参考ページ
- 株式会社シラボのHPです。書籍のように必要な技術が掲載されています。
https://shilabo.com/
https://shilabo.com/python/web_self/a001_000/a001_001/
* pandasのAPIドキュメント
https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html * Pythonのドキュメント
https://docs.python.org/3/library/codecs.html#standard-encodings