Pythonでコード書いてると、1回は残念だなぁと思うポイントとして表題の件があると思います。具体的には以下です。
# リストも辞書も出力がお世辞にも良いとは言えない。。
>>> print ['あ', 'い', 'う']
['\xe3\x81\x82', '\xe3\x81\x84', '\xe3\x81\x86']
>>> print {'title':'ねじまき鳥', 'author':'村上春樹'}
{'author': '\xe6\x9d\x91\xe4\xb8\x8a\xe6\x98\xa5\xe6\xa8\xb9', 'title': '\xe3\x81\xad\xe3\x81\x98\xe3\x81\xbe\xe3\x81\x8d\xe9\xb3\xa5'}
日本語がバイト表現な上、全要素が1行で表示されています。これではちょっとprintデバッグするにも萎えますよね。複雑な辞書を出力した場合なんかは、出力された文字列の整形にかなりのパワーを裂かれること請け合いです。
前々から何とかならないかと、悶々とした日々を過ごしていたのですが、先ほど駄目元で以下のコードを試してみたところ無事pretty printに成功しました。一旦json形式にした文字列を、evalでunicode文字列として再評価しています。そうする事でエスケープ表記されたunicode文字からunicodeオブジェクトを作っています。無理矢理感は否めませんが、背に腹は代えられないでしょう!
#!/usr/bin/python
# -*- coding: utf-8 -*-
import simplejson as json
def pp(obj):
if isinstance(obj, list) or isinstance(obj, dict):
orig = json.dumps(obj, indent=4)
print eval("u'''%s'''" % orig).encode('utf-8')
else:
print obj
これで例えば以下の様な出力が得られます。これで安心してリストと辞書を使えるようになりました。
>>> pp(['あ', 'い', 'う'])
[
"あ",
"い",
"う"
]
>>> pp({'title':'ねじまき鳥', 'author':'村上春樹'})
{
"author": "村上春樹",
"title": "ねじまき鳥"
}
たった4行ですが、達成感があります:) なので今は凄く良い気になっているのですが、常識かもっといい方法があったら恥ずかしいので教えて下さい。
2010.3.8 追記
個人的には割と使用頻度が高いので、prettyprintモジュールにしてpypiに登録しました。インストールはeasy_installから。ソースはgithubから。
$ easy_install prettyprint
出力するppメソッドと、整形文字列を返すpp_strが定義されただけの酷く簡単なモジュールです。
from prettyprint import pp, pp_str
target = {'order':'綺麗に表示せよ'}
pp(target)
print pp_str(target)
とっても役にたちました。ありがとうございます。
私はgoogle+のデータをPythonで処理してるのですが(趣味で)、その際に役にたちました。
コメントありがとうございます!
簡単なコードですけど、役に立ったみたいで良かったです。
こんな方法があるそうです
print str(_).decode(“string-escape”)
print str(_).decode(“unicode-escape”)
(python.rdy.jp/wiki.cgi?page=japaneseCharset より)