[Python] pprintモジュールによるデータ出力の整列化(pprint.pprint)

Python モジュール

print文はオブジェクトを画面出力するのにはとても便利な関数ですが、長くなったり複雑な構造をもったシーケンスを表示する時は、横にズラッと並んで見難くなってしまうことがよくあると思います。
そんな時はPython標準組み込みライブラリのpprintモジュールを使って、見栄えをきれいにすることが出来ます。
本記事では、pprint.pprint関数の使い方についてまとめます。

確認した環境

  • Ubuntu16.04LTS
  • Python3.7.2@Anaconda

pprint.pprint関数による書式整形

組み込みライブラリなので、新たにインストールする必要はありません。
通常のprint文では横に並んで見難い出力結果を、書式整形して見やすくしてくれます。
使い方は下記の通り。

pprint.pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False)

第一引数objectに出力したいオブジェクト(リスト、辞書等)を設定します。
例を下記に示します。

# 辞書データの例
>>> d = {'a': 100, 'b': 200, 'c': 300, 'd': 400, 'e': 500, 'f': 600, 'g': 700}

# 通常のprint文を使った場合
>>> print(d)
{'aaa': 100, 'bbb': 200, 'ccc': 300, 'ddd': 400, 'eee': 500, 'fff': 600, 'ggg': 700}

# pprint.pprintを使った場合
>>> import pprint
>>> pprint.pprint(d)
{'aaa': 100,
 'bbb': 200,
 'ccc': 300,
 'ddd': 400,
 'eee': 500,
 'fff': 600,
 'ggg': 700}

indent, width, depth, compactの設定

見栄えを調整するには、indent, width, depth, compact引数を設定します。

indentの設定

インデント(左から何マス空けるか)を設定します。デフォルトはindent=1です。
以下に例を示します。

# デフォルト(indent=1)の場合
>>> pprint.pprint(d)
{'aaa': 100,
 'bbb': 200,
 'ccc': 300,
 'ddd': 400,
 'eee': 500,
 'fff': 600,
 'ggg': 700}

# indent=4の場合
>>> pprint.pprint(d, indent=4)
{   'aaa': 100,
    'bbb': 200,
    'ccc': 300,
    'ddd': 400,
    'eee': 500,
    'fff': 600,
    'ggg': 700}

widthの設定

一行に出力する文字の数を設定します。デフォルトはwidth=80です。
リストや辞書データの文字数がwidthの値より小さい場合は、要素ごとに改行されます(後述するcompact=Falseの場合)。よって、きっちり設定した文字数にならない場合があります。

# リストのデータ
>>> l = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg']

# デフォルト設定(width=80)の場合 -> 80文字以下なので改行されず
>>> pprint.pprint(l)
['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg']

# width=20に設定 
>>> pprint.pprint(l, width=20)
['aaa',
 'bbb',
 'ccc',
 'ddd',
 'eee',
 'fff',
 'ggg']

尚、辞書の要素(key:valueの並び)は途中で改行されませんが、valueにスペースがある場合は改行されます。

# 辞書のvalueにスペースが含まれるデータ
>>> dd = {'aaa': '100 111', 'bbb': '200 222', 'ccc': '300 333'}

# width=40の場合 
>>> pprint.pprint(dd, width=40)
{'aaa': '100 111',
 'bbb': '200 222',
 'ccc': '300 333'}

# width=1(極端ですが・・・)に設定すると、valueのスペース部分で改行 
>>> pprint.pprint(dd, width=1)
{'aaa': '100 '
        '111',
 'bbb': '200 '
        '222',
 'ccc': '300 '
        '333'}

depthの設定

入れ子構造のレベルを設定します。デフォルトはdepth=None(制限無し)です。
指定以上の深いレベルのものは (…) で置き換えられて表示されます。

# 入れ子構造の辞書データ
>>> ddd = {'aaa': {'xxx': '001', 'yyy': {'key1':'value1', 'key2':'value2'}}, 'bbb': 200, 'ccc': 300}

# デフォルト設定(depth=None)
>>> pprint.pprint(ddd)
{'aaa': {'xxx': '001', 'yyy': {'key1': 'value1', 'key2': 'value2'}},
 'bbb': 200,
 'ccc': 300}

# depth=1の場合
>>> pprint.pprint(ddd, depth=1)
{'aaa': {...}, 'bbb': 200, 'ccc': 300} ★ (...)で表示されています

compactの設定

compact=Falseの場合(デフォルトはこれ)、一要素ずつ改行されて表示されます。
compact=Trueの場合、widthに収まるだけの要素が一行に表示されます。

# リストのデータ
>>> l = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg']

# デフォルト値(compact=False)の場合 
>>> pprint.pprint(l, width=20)
['aaa',
 'bbb',
 'ccc',
 'ddd',
 'eee',
 'fff',
 'ggg']

# compact=Trueの場合 
>>> pprint.pprint(l, width=20, compact=True)
['aaa', 'bbb',
 'ccc', 'ddd',
 'eee', 'fff',
 'ggg']

streamの設定

streamは出力先を設定します。デフォルト(stream=None)の場合はsys.stdoutになるので、特に気にする必要はないと思います。
ここを下記のようにファイルに設定すると、ファイルへの書き出しが可能となります。

>>> with open('test.data', 'w') as f:
... pprint.pprint(ddd, stream=f)
...

<参考> 公式リファレンス:pprint — データ出力の整然化 pprint.pprint

pprint.pformat()関数

画面に表示せず、objectを整形して文字列として返します。
使い方は下記の通りです。設定内容はpprint関数と同じです。

pprint.pformat(object, indent=1, width=80, depth=None, *, compact=False)

例を以下に示します。

# 入れ子構造の辞書データ
>>> ddd = {'aaa': {'xxx': '001', 'yyy': {'key1':'value1', 'key2':'value2'}}, 'bbb': 200, 'ccc': 300}
 
# pprintによる出力
>>> import pprint
>>> pprint.pprint(ddd, indent=2, width=5, depth=2)
{ 'aaa': { 'xxx': '001',
           'yyy': { 'key1': 'value1',
                    'key2': 'value2'}},
  'bbb': 200,
  'ccc': 300}

# 文字列として出力
>>> pprint.pformat(ddd, indent=2, width=5, depth=2)
"{ 'aaa': { 'xxx': '001',\n           'yyy': { 'key1': 'value1',\n                    'key2': 'value2'}},\n  'bbb': 200,\n  'ccc': 300}"

ファイルへの出力は、例えば下記のようにします。

>>> with open('pprint_text2', 'w') as f:
...     f.write(pprint.pformat(ddd, indent=2, width=5, depth=2))
... 
130

pprint.pprintでstreamをファイルオブジェクトに設定したのと同じですね。

<参考> 公式リファレンス:pprint — データ出力の整然化 pprint.pformat

まとめ

pprint.pprint関数を使ってデータを書式整形して見やすく出力する方法についてまとめました。

Learn more...

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

シェアする
ひびきをフォローする
Hbk project