Skip to content

9.5 データを読みやすい形式で出力する — pprint

Web APIから取得したJSONデータや、複雑にネストされた(階層が深い)辞書・リストの構造を確認したいとき、通常の print() 関数を使うと、すべてのデータが1行に押し込まれて出力されてしまい、非常に読みづらくなります。

そんな時に活躍するのが、Pythonの標準ライブラリである 「pprint」(pretty-print:綺麗に印刷する)モジュールです。

本記事では、「9.5 データを読みやすい形式で出力する」として、pprint を使ったデータの見やすい表示方法と、便利なカスタマイズ引数について解説します。

1. print と pprint の違いを体感する

Section titled “1. print と pprint の違いを体感する”

百聞は一見に如かずです。同じ複雑なデータを、通常の print()pprint() の両方で出力して比較してみましょう。

from pprint import pprint
# 複雑にネストされたデータ(辞書の中にリストや辞書が入っている)
user_data = {
"id": 101,
"name": "Alice",
"roles": ["admin", "editor"],
"settings": {
"theme": "dark",
"notifications": {"email": True, "sms": False}
}
}
print("--- 通常の print の場合 ---")
print(user_data)
print("\n--- pprint の場合 ---")
pprint(user_data)

【出力結果】

--- 通常の print の場合 ---
{'id': 101, 'name': 'Alice', 'roles': ['admin', 'editor'], 'settings': {'theme': 'dark', 'notifications': {'email': True, 'sms': False}}}
--- pprint の場合 ---
{'id': 101,
'name': 'Alice',
'roles': ['admin', 'editor'],
'settings': {'notifications': {'email': True, 'sms': False},
'theme': 'dark'}}

通常の print() では全体が1行にベタ書きされますが、pprint() を使うとデータの階層構造に合わせて自動的に改行とインデント(字下げ)が行われ、人間がひと目で構造を理解できる形になります。また、辞書のキーも自動的にアルファベット順にソートされて表示されます。

2. pprint() の便利なカスタマイズ引数

Section titled “2. pprint() の便利なカスタマイズ引数”

pprint() 関数には、出力形式を細かく調整できる便利な引数が用意されています。

各階層を下げる際のスペースの数を指定します。デフォルトは 1 です。数値を大きくすると、より深く字下げされます。

# インデントを 4 スペースにする
pprint(user_data, indent=4)

出力する1行の最大文字数を指定します。デフォルトは 80 文字です。データがこの文字数に収まる場合は1行で表示され、超える場合は改行して整形されます。この値を小さくすると、短いデータでも強制的に改行させることができます。

# 幅を 20 文字に制限して、細かく改行させる
pprint(user_data, width=20)

データが深すぎる(階層が多すぎる)場合に、表示する深さを制限します。指定した階層より深い部分は {...}[...] のように省略して表示されるため、巨大なデータの全体像をざっくり掴みたい時に便利です。

# 階層の深さを 1 までに制限する
pprint(user_data, depth=1)
# 出力例: {'id': 101, 'name': 'Alice', 'roles': [...], 'settings': {...}}

3. 出力せずに文字列として取得する:pformat()

Section titled “3. 出力せずに文字列として取得する:pformat()”

pprint() は標準出力(コンソール)に直接データを出力しますが、時には「整形された文字列をファイルに保存したい」あるいは「ログ(logging)に記録したい」という場面があります。

そのような場合は、pprint.pformat() 関数を使用します。使い方は pprint() と全く同じですが、出力する代わりに整形済みの文字列を返してくれます。

from pprint import pformat
import logging
# 文字列として取得
formatted_str = pformat(user_data, indent=2)
# ロガーに書き込むなどの処理に利用可能
logging.info("ユーザーデータ:\n" + formatted_str)

デバッグやログ解析の効率を上げるために、複雑なデータを扱う際は print() の代わりに pprint() を使う癖をつけておくと非常に役立ちます。