pandas .to_csv エラー対策: UnicodeEncodeError: ‘shift_jis’ codec can’t encode character

yellow scrabble tiles

Pandasの.to_csvメソッドを使用してCSVファイル出力を行う際にUnicodeEncodeErrorを起こしたので,備忘録的に対策を記載。

ページ作成者のOSはWindowsなので,Linux / Mac OS での再現性は未検証。

UnicodeEncodeErrorの再現・原因

全角文字”~”を含むpandas.DataFrameをCSV出力する際に,文字エンコードに”shift-jis”を指定することでエラー再現。

import pandas as pd

data = ['~']
df = pd.DataFrame(data)
df.to_csv('error.csv', encoding='shift-jis')

上記コードを実行すると,下記の通りUnicodeEncodeErrorが発生する。

UnicodeEncodeError: 'shift_jis' codec can't encode character '\uff5e' in position 2: illegal multibyte sequence

このエラーは文字エンコードの失敗に由来する。これはWindows標準の文字コードである”cp932″と”shift-jis”で,文字”~”に対するUnicodeのマップが異なるため。つまり,pandasの.to_csvメソッドの問題ではなく,文字列のエンコード段階にエラー発生の原因がある。

解決策

1.CSV出力時のエンコードを変更する

CSVファイル出力だけを目的とするのであれば,CSV出力時の文字エンコード方式を”cp932″と指定すればよい。

import pandas as pd

data = ['~']
df = pd.DataFrame(data)
df.to_csv('error.csv', encoding='cp932')  # CSV出力の文字エンコードに'cp932'を指定

2.文字デコード方式を変更する

CSVファイルの文字エンコード方式が指定される場合には,内部の文字列をCSV出力前に指定方式でデコードしておけばよい。以下は”shift-jis”が指定された場面を想定している。

import pandas as pd

data = ['~'.encode('cp932').decode('shift-jis')]  # 文字"~"をcp932でエンコードしてshift-jisで再デコード
df = pd.DataFrame(data)
df.to_csv('error.csv', encoding='shift-jis')  # CSV出力の文字エンコードに'shift-jis'を指定

“utf-8″など別の文字エンコード方式を使用したい場合は,上記コードの”shift-jis”の部分を指定文字エンコード方式に書き換えるとよい。

コメント