本稿の投稿経緯
python初心者の私が、csvファイルの読み書きの際のエンコードにたまにエラーに躓くので、その内容のまとめをメモしたもの。同じく初心者向けの記事になります。なお、環境はwindows環境になります。
エラー
csvファイルの読み書きの際に、よく引っかかるエラーについて
書き込み時のエラー
UnicodeEncodeError: 'shift_jis' codec can't encode character '\u9ad9' in position 14: illegal multibyte sequence
shift-jisでエンコードできない文字があるよってことですね。ファイル書き込みの際にファイルの文字コードと書き込み文字の文字コードの不一致で発生します。
ちなみにコードの指定箇所はここなど。
with open(filepath, 'w', newline='', encoding='shift-jis') as f
読み込み時のエラー
UnicodeDecodeError: 'shift_jis' codec can't decode byte 0xee in position 0
shift-jisででコードできない文字があるよってことですね。ファイル読み込みの際にファイルの文字コードとファイルの読み込みで指定した文字コードの不一致で発生します。(もしくは、ファイルの読み込み時に指定した文字コードで読めない文字がファイルに書き込まれている。)
ちなみにコードの指定箇所はここなど。
data = pd.read_csv(filepath, encoding = 'shift-jis')
正しい文字コードの指定は?
ファイル作成、書き込み、読み込みの一連の動作をpython上でする場合は、以下の横軸通りに指定しておけば、エラーは発生しないはずです。
(ファイルの文字コードの意味は、書き込み時に指定した文字コードによって作成されるcsvの文字コードを表しています)
書き込み時の文字コード | ファイルの文字コード | 読み込み時の文字コード |
---|---|---|
UTF-8 | UTF-8 | UTF-8 |
cp932 | ansi | cp932 |
shift-jis | ansi | shift-jis |
cp932もshift-jisもファイルだとansiだけどどっちつかうの?
cp932とshift-jisの違いは、例えば**髙(はしごだか)や﨑(たてさき)**といった、環境依存文字が取り扱いできるかどうかの違いが一番の差かと思います。できるのがcp932になります。なので、例えば、他システムからansiのcsvファイルが連携されてくる時は、shift-jisではなく、cp392で取り込む想定にしておくほうが吉ということです。