RとPythonによるデータマイニング

企業でデータ分析などやっています。主にRやPythonによるデータマイニング・機械学習関連の話題と日々の日記やその他備忘録について書いてます。

[Python]UnicodeEncodeErrorの対処

Pythonで日本語を利用しているとき、unicode文字列をstr関数に渡すとUnicodeEncodeErrorが起きます。
例えば以下のコードを実行すると次のようなエラーが出てきます。

コード
#!/usr/bin/python
# -*- coding: utf-8 -*-

test = u"テスト"
print str(test)
エラー
Traceback (most recent call last):
  File "pygame_base_template.py", line 5, in <module>
    print str(test)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)


正直なぜこのようなエラーが起こるのか把握してないのですが、解決方法は簡単です。

解決方法1

コード内においてsysモジュールをリロードしてデフォルトエンコーディングを指定。
例えば以下のように記述します。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

test = u"テスト"
print str(test)
解決方法2

site-packageフォルダ以下にsitecustomize.pyファイルを作成し、デフォルトエンコーディングを記述。
具体的には、/usr/lib/python2.4/site-package/sitecustomize.py を作成し、sitecustomize.pyの中に以下のように記述します。

import(sys)
sys.setdefaultencoding("utf-8")


解決方法1は毎回コードに記入する感じで、解決方法2は一回作成すれば同一環境では気にしなくてよくなります。
個人的には作業環境に依存せずに使える解決方法1を利用してます。
自宅PCで設定を変更するのは問題ないですが、職場だと勝手に変更できないですからね。
Pythonを書くときはエディタを開いたら取り合えず上記5行とメイン関数をコピペしてから書き出します。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

def main():
    pass

if __name__ == "__main__":
    main()

この辺の細かな定形化はストレスなくコードを書くためには結構重要だと思います。