無駄と文化

実用的ブログ

Python2 で日本語(Unicode)対応の PrettyPrint

通常、print はユニコード文字列であっても読みやすく表示してくれます。

print(u"ほげ")
# => ほげ

しかし pprint モジュールの pprint() を使うと、なぜだかユニコード文字列がエスケープされるようになります。

pprint.pprint(u"ほげ")
# => u'\u307b\u3052'

ちょっとしたデバッグ目的で PrettyPrint するときはユニコード文字列の部分もちゃんと読みたいし不便ですね。


ユニコード対応版

というわけで、

# -*- coding: utf-8 -*-

from __future__ import print_function

import pprint


def pp(obj, end="\n"):
    print(pf(obj), end)

def pf(obj):
    return (pprint
        .pformat(obj, indent=4)
        .decode("unicode-escape")
    )


if __name__ == "__main__":
    obj = {
        u"ほげ": u"ぴよ",
        u"nums": [1, 2, 3, u"四", u"五"],
        u"bool": True,
    }

    pprint.pprint(obj, indent=4)  # 通常
    # =>
    # {   u'bool': True,
    #     u'nums': [1, 2, 3, u'\u56db', u'\u4e94'],
    #     u'\u307b\u3052': u'\u3074\u3088'}

    pp(obj)                       # ユニコード対応版
    # =>
    # {   u'bool': True,
    #     u'nums': [1, 2, 3, u'四', u'五'],
    #     u'ほげ': u'ぴよ'}

はい


pformat() した後に .decode("unicode-escape") でユニコードエスケープされたところを元に戻しています。


参考にしました

qiita.com

d.hatena.ne.jp

感謝!


私からは以上です。