データ分析がしたい

企業でデータ分析などやっています。主に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()

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