Pythonで日本語を含んだリストと辞書をpretty printしたい件

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)

5 thoughts on “Pythonで日本語を含んだリストと辞書をpretty printしたい件”

  1. とっても役にたちました。ありがとうございます。
    私はgoogle+のデータをPythonで処理してるのですが(趣味で)、その際に役にたちました。

  2. コメントありがとうございます!
    簡単なコードですけど、役に立ったみたいで良かったです。

  3. こんな方法があるそうです
    print str(_).decode(“string-escape”)
    print str(_).decode(“unicode-escape”)
    (python.rdy.jp/wiki.cgi?page=japaneseCharset より)

Leave a Reply

Your email address will not be published. Required fields are marked *