Python2.7でこんなコードを書いたらUnicodeEncodeErrorエラー。
infile = codecs.open(file, "r", "cp932") dat = csv.reader(infile) y_sig = [] for row in dat: y_sig.append(row[6])
IDE上ではエラーにならないが、ソースコードを実行するとエラーになる。
それも、なぜかforの行でUnicodeEncodeErrorエラーが発生。
原因はたぶん、csv.readerがunicode型に対応していないらしいこと。(詳細は不明)
このバージョンの csv モジュールは Unicode 入力をサポートしていません。また、現在のところ、 ASCII NUL 文字に関連したいくつかの問題があります。従って、安全を期すには、全ての入力を UTF-8 または印字可能な ASCII にしなければなりません。
13.1. csv — CSV ファイルの読み書き — Python 2.7ja1 documentation
そこで、以下のように、decodeしてunicode型にするタイミングを後ろにずらしたらokになった。
infile = codecs.open(file, "rb") dat = csv.reader(infile) y_sig = [] for row in dat: y_sig.append(row[6].decode('cp932'))
ついでにunicode型と decode,encodeについて勉強。 特に参考になったページのリンクをメモ。
PythonのUnicodeEncodeErrorを知る - HDEラボ ゼロから概念を学ぶのに役立ちました。わかりやすい。
Unicode HOWTO 詳細で明確に記載されている。
今回は特殊なケースだけど、通常は、できるだけ早めにunicode型にして、その後はギリギリまでunicode型を保つのがいいらしい。
python3で標準がunicode型になると、こんな煩わしさもなくなるんだろうか。