Pythonでプログラムを開発している際、複雑にネストされた辞書やリストの内容を確認したい場面は非常に多いです。
しかし、標準のprint()関数を使用すると、すべてのデータが1行に凝縮されて出力されてしまうため、構造を直感的に把握することが困難です。
このような問題を解決するために用意されているのが、Pythonの標準ライブラリであるpprintモジュールです。
このモジュールを活用することで、複雑なデータ構造を適切に改行・インデントし、人間にとって読みやすい形式で出力できます。
本記事では、pprintモジュールの基本的な使い方から、出力をカスタマイズするための高度なオプションまでを詳しく紹介します。
pprintモジュールとは
pprintは「Pretty-Print」の略称であり、その名の通りデータを「綺麗に表示する」ための機能を提供します。
Pythonの標準ライブラリに含まれているため、追加のインストール作業を行う必要はなく、import pprintと記述するだけで利用可能です。
主にAPIから取得した多階層のJSONデータや、複雑な設定値を持つ辞書オブジェクトのデバッグ作業において、データの階層構造を一目で理解できるようになるという大きなメリットがあります。
また、データ型を維持したまま整形されるため、デバッグだけでなくログ出力などの用途にも適しています。
pprintの基本的な使い方
まずは、最も基本的なpprint.pprint()関数の使い方を見ていきましょう。
以下のサンプルコードでは、ネストされた辞書データを用意し、通常のprint()とpprint()で出力結果がどのように異なるかを比較しています。
import pprint
# ネストされた複雑な辞書データ
data = {
"user_id": 12345,
"profile": {
"name": "Tanaka Taro",
"age": 30,
"hobbies": ["reading", "cycling", "programming"]
},
"metadata": {
"last_login": "2026-05-25",
"status": "active",
"tags": ["admin", "developer", "tester"]
}
}
print("--- print関数の出力 ---")
print(data)
print("\n--- pprint関数の出力 ---")
pprint.pprint(data)
--- print関数の出力 ---
{'user_id': 12345, 'profile': {'name': 'Tanaka Taro', 'age': 30, 'hobbies': ['reading', 'cycling', 'programming']}, 'metadata': {'last_login': '2026-05-25', 'status': 'active', 'tags': ['admin', 'developer', 'tester']}}
--- pprint関数の出力 ---
{'metadata': {'last_login': '2026-05-25', 'status': 'active', 'tags': ['admin', 'developer', 'tester']},
'profile': {'age': 30,
'hobbies': ['reading', 'cycling', 'programming'],
'name': 'Tanaka Taro'},
'user_id': 12345}
実行結果を見ると、pprint()を使用した場合は階層ごとに適切に改行され、インデントが挿入されていることがわかります。
これにより、データがどのような親子関係を持っているのかが即座に判別できるようになります。
出力形式をカスタマイズする主要な引数
pprint.pprint()関数には、表示形式を細かく制御するための引数がいくつか用意されています。
これらを活用することで、プロジェクトのルールや好みに合わせた整形が可能です。
indent:インデントの幅を指定する
indent引数を使用すると、階層が変わる際に追加されるスペースの数を変更できます。
デフォルトは1ですが、階層をより強調したい場合は大きな値を設定します。
# インデントを4スペースに設定
pprint.pprint(data, indent=4)
{ 'metadata': { 'last_login': '2026-05-25',
'status': 'active',
'tags': ['admin', 'developer', 'tester']},
'profile': { 'age': 30,
'hobbies': ['reading', 'cycling', 'programming'],
'name': 'Tanaka Taro'},
'user_id': 12345}
width:1行の最大文字数を制限する
width引数は、1行に表示できる最大文字数を指定します(デフォルトは80文字)。
この値を小さく設定すると、要素が横に並びすぎず、強制的に改行を増やしてコンパクトに表示させることができます。
# 1行の幅を40文字に制限
pprint.pprint(data, width=40)
{'metadata': {'last_login': '2026-05-25',
'status': 'active',
'tags': ['admin',
'developer',
'tester']},
'profile': {'age': 30,
'hobbies': ['reading',
'cycling',
'programming'],
'name': 'Tanaka Taro'},
'user_id': 12345}
depth:表示する階層の深さを制限する
非常に巨大なデータ構造を扱う場合、すべての階層を表示すると出力が長くなりすぎることがあります。
depth引数を指定すると、特定の深さ以上のデータは...と省略して表示されます。
# 2階層目まで表示
pprint.pprint(data, depth=2)
{'metadata': {...}, 'profile': {...}, 'user_id': 12345}
compact:複数の要素を1行にまとめる
compact引数をTrueに設定すると、リストなどの要素ができるだけ1行に収まるように調整されます。
widthの制限を守りつつ、可能な限りスペースを節約して表示したい場合に便利です。
sample_list = [i for i in range(20)]
pprint.pprint(sample_list, width=30, compact=True)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16,
17, 18, 19]
sort_dicts:辞書のキーをソートするか指定する
Python 3.8以降、pprint()はデフォルトで辞書のキーをアルファベット順にソートして出力します。
データの挿入順序を維持したい場合は、sort_dicts=Falseを指定します。
# 辞書のキーの並び替えを無効化
pprint.pprint(data, sort_dicts=False)
pformat:整形された文字列を取得する
pprint.pprint()は結果を直接標準出力(コンソール)に表示しますが、整形された結果を文字列として変数に格納したい場合があります。
そのようなケースでは、pprint.pformat()関数を使用します。
ログファイルへの書き込みや、GUIアプリケーションのテキストエリアに表示させる際に非常に有用です。
# 整形された文字列を取得
formatted_str = pprint.pformat(data)
# 文字列なので後からファイル保存などが可能
with open("log.txt", "w") as f:
f.write(formatted_str)
実用的な活用シーン:APIレスポンスのデバッグ
Webアプリケーションの開発では、外部APIから取得した大規模なJSONレスポンスを解析することが頻繁にあります。
以下の表は、開発現場でpprintがどのような場面で役立つかをまとめたものです。
| 利用シーン | pprintを使うメリット |
|---|---|
| APIレスポンスの確認 | 多層構造のJSONが可視化され、必要なフィールドを特定しやすくなる。 |
| 複雑な設定ファイルの検証 | 複数のネストがある辞書形式の設定値に誤りがないか一目で確認できる。 |
| エラー発生時のログ出力 | エラー時のオブジェクト状態を読みやすい形で記録し、調査効率を向上させる。 |
| 大規模リストの表示 | widthやcompactを使い、画面外に溢れない適切な幅でリストを確認できる。 |
まとめ
Pythonのpprintモジュールは、プログラムが扱うデータを人間にとって読みやすく整形するための強力なツールです。
標準のprint()関数だけでは把握しづらかった複雑なデータ構造も、pprint()を使えば瞬時に理解できるようになります。
indentやwidth、depthといった引数を使いこなすことで、さらに自由度の高いデバッグが可能になります。
効率的なコーディングとエラー修正のために、ぜひ日々の開発プロセスにpprintを取り入れてみてください。
