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”の部分を指定文字エンコード方式に書き換えるとよい。
コメント