コンテンツにスキップ

pprintの使い方と修正方法は?

[

Pythonでデータ構造を整形してキレイに表示しましょう

データの処理はPythonistaにとって重要ですが、時にはデータが見づらい場合もあります。コンピュータはフォーマットには興味がありませんが、見やすいフォーマットがなければ、人間は何かを読むのが難しくなるかもしれません。大きな辞書や長いリストにprint()を使用すると、出力は効率的ですがキレイではありません。

Pythonのpprintモジュールは、データ構造をキレイで読みやすい形式で出力するためのユーティリティモジュールです。APIリクエストや大きなJSONファイル、一般的なデータに対してデバッグするコードで特に便利な、標準ライブラリの一部です。

このチュートリアルの最後までには、以下のことができるようになります:

  • pprintモジュールがなぜ必要かを理解する
  • **pprint()PrettyPrinter**を使い方
  • パラメータについて学ぶ
  • 独自の**PrettyPrinter**インスタンスを作成する
  • 出力をフォーマットされた文字列として保存する方法
  • 再帰的なデータ構造の表示と認識

途中で、公共のAPIへのHTTPリクエストや、JSONの解析が実際に行われます。

無料ボーナス: ここをクリックしてPythonのチートシートを入手し、データ型、辞書、リスト、Pythonの関数などの基礎を学びましょう。

PythonのPretty Printの必要性を理解する

pprintを探求する前に、urllibを使用してデータを取得するためにHTTPリクエストを行います。実際のユーザー情報を持つ{JSON} Placeholderにリクエストを行います。最初に行うことは、HTTPのGETリクエストを作成し、レスポンスを辞書として取得することです。

from urllib import request
response = request.urlopen("https://jsonplaceholder.typicode.com/users")
json_response = response.read()
import json
users = json.loads(json_response)

ここでは、基本的なGETリクエストを作成し、json.loads()を使ってレスポンスを辞書にパースしています。辞書が変数に格納されたので、一般的な次のステップはprint()を使って内容を表示することです。

print(users)

しかし、このままだと出力は改行を含んでいません。

それでは、キレイに表示するためにpprintモジュールを使ってみましょう。

pprintモジュールの使い方

pprintを使うと、データをキレイで見やすい形式で表示できます。pprintモジュールは、pprint()関数とPrettyPrinterクラスの2つの主要なコンポーネントからなります。

まず、pprint()関数から始めましょう。これは次のように使います:

from pprint import pprint
pprint(users)

これにより、辞書が次のようにキレイに表示されます:

[{'address': {'city': 'Gwenborough',
'geo': {'lat': '-37.3159', 'lng': '81.1496'},
'street': 'Kulas Light',
'suite': 'Apt. 556',
'zipcode': '92998-3874'},
'company': {'catchPhrase': 'Multi-layered client-server neural-net',
'name': 'Romaguera-Crona',
'bs': 'harness real-time e-markets'},
'email': 'Sincere@april.biz',
'id': 1,
'name': 'Leanne Graham',
'phone': '1-770-736-8031 x56442',
'username': 'Bret',
'website': 'hildegard.org'}]

これにより、辞書のキーと値がインデントされて表示され、データが見やすくなります。

pprint()は多くのオプション引数を受け取ることができます。以下では、一部のオプション引数について見ていきます。

オプション引数の探索

データの要約: 深さ (depth)

pprint()にはdepthというオプション引数があります。これは、表示するデータの深さを制御するために使用されます。デフォルトではNoneに設定されており、すべての深さが表示されます。

例えば、データの深さを制限して表示する場合は次のようにします:

# データの深さを1に制限して表示
pprint(users, depth=1)

これにより、辞書の最初のレベルのキーと値のみが表示されます:

[{'address': ...,
'company': ...,
'email': ...,
'id': ...,
'name': ...,
'phone': ...,
'username': ...,
'website': ...}]

depthは、辞書やリストの入れ子構造がどれだけ深く繰り返されるかを制御する際に便利です。

データの間隔: インデント (indent)

pprint()のもう1つのオプション引数はindentです。これにより、データを表示するときのインデントの量を制御できます。デフォルトでは、インデントの量は1ですが、整数値を指定してインデントの量を変更することができます。

例えば、インデントの量を2に変更したい場合は次のようにします:

# インデントの量を2に変更して表示
pprint(users, indent=2)
[
{
'address': {
'city': 'Gwenborough',
'geo': {
'lat': '-37.3159',
'lng': '81.1496'
},
'street': 'Kulas Light',
'suite': 'Apt. 556',
'zipcode': '92998-3874'
},
'company': {
'catchPhrase': 'Multi-layered client-server neural-net',
'name': 'Romaguera-Crona',
'bs': 'harness real-time e-markets'
},
'email': 'Sincere@april.biz',
'id': 1,
'name': 'Leanne Graham',
'phone': '1-770-736-8031 x56442',
'username': 'Bret',
'website': 'hildegard.org'
}
]

インデントを変更することで、データがより見やすくなります。

行の長さの制限: 幅 (width)

pprint()widthオプション引数は、表示される各行の長さを制限するために使用されます。デフォルトでは、制限はありませんが、整数値を指定して制限を設定することができます。

# 各行の長さを40に制限して表示
pprint(users, width=40)
[{'address': {'city': 'Gwenborough',
'geo': {'lat': '-37.3159',
'lng': '81.1496'},
'street': 'Kulas Light',
'suite': 'Apt. 556',
'zipcode': '92998-3874'},
'company': {'catchPhrase': 'Multi-layered...',
'name': 'Romaguera-Crona',
'bs': 'harness real-time e-markets'},
'email': 'Sincere@april.biz',
'id': 1,
'name': 'Leanne Graham',
'phone': '1-770-736-8031 x56442',
'website': 'hildegard.org'}]

行が指定された長さを超えないようになります。

その他のオプション引数

pprint()には他にもいくつかのオプション引数があります。以下ではそれらを見ていきます。

データのシーケンスの圧縮: compact

compactオプションは、リストや文字列のようなシーケンスの表示方法を制御するために使用されます。デフォルトでは、compactFalseに設定されており、改行を含むようになりますが、Trueに設定すると改行を含まないようになります。

# compactをTrueに設定して表示
pprint(users, compact=True)
[{'address': {'city': 'Gwenborough', 'geo': {'lat': '-37.3159', 'lng': '81.1496'}, 'street': 'Kulas Light', 'suite': 'Apt. 556', 'zipcode': '92998-3874'},
'company': {'catchPhrase': 'Multi-layered client-server neural-net', 'name': 'Romaguera-Crona', 'bs': 'harness real-time e-markets'},
'email': 'Sincere@april.biz',
'id': 1,
'name': 'Leanne Graham',
'phone': '1-770-736-8031 x56442',
'website': 'hildegard.org'}]

この設定により、シーケンスがより短い形式で表示されます。

出力の制御: stream

streamオプション引数は、出力先を指定するために使用されます。デフォルトでは、出力は標準出力に送信されますが、適切なファイルオブジェクトを指定することもできます。

# 出力をファイルに保存
with open("output.txt", "w") as f:
pprint(users, stream=f)

このようにして、出力はoutput.txtというファイルに保存されます。

辞書のソートの抑制: sort_dicts

sort_dictsオプションは、辞書の出力時のキーのソートを制御するために使用されます。デフォルトでは、キーはソートされますが、Falseに設定するとソートされません。

# 辞書のソートを抑制して表示
pprint(users, sort_dicts=False)
[{'id': 1,
'name': 'Leanne Graham',
'username': 'Bret',
'email': 'Sincere@april.biz',
'address': {'street': 'Kulas Light',
'suite': 'Apt. 556',
'city': 'Gwenborough',
'zipcode': '92998-3874',
'geo': {'lat': '-37.3159', 'lng': '81.1496'}},
'phone': '1-770-736-8031 x56442',
'website': 'hildegard.org',
'company': {'name': 'Romaguera-Crona',
'catchPhrase': 'Multi-layered client-server neural-net',
'bs': 'harness real-time e-markets'}}]

この設定では、キーはソートされずに表示されます。

数値のキレイ化: underscore_numbers

underscore_numbersオプションは、数値の表示方法を制御するために使用されます。デフォルトでは、数値は変更されませんが、Trueに設定すると、数値の中にアンダースコアが表示されます。

# 数値の中にアンダースコアを表示して表示
pprint(users, underscore_numbers=True)
[{'address': {'street': 'Kulas Light',
'suite': 'Apt. 556',
'city': 'Gwenborough',
'zipcode': '92998-3874',
'geo': {'lat': '-37.3159', 'lng': '81.1496'}},
'company': {'name': 'Romaguera-Crona',
'catchPhra...

この設定により、数値がよりわかりやすく表示されます。

PrettyPrinterオブジェクトの作成

PrettyPrinterクラスを使用してpprintのオプションをカスタマイズすることもできます。PrettyPrinterクラスは、pprint()関数と同様の動作をしますが、オプション引数を直接指定することができます。例えば、インデントを2に設定する場合は次のようにします。

from pprint import PrettyPrinter
pp = PrettyPrinter(indent=2)
pp.pprint(users)

PrettyPrinterを使用すると、異なるオプションを異なるオブジェクトで使用することができます。

pformat()を使用してキレイな文字列を取得する

pprintではなく、キレイな文字列を取得したい場合は、pformat()関数を使用できます。これにより、文字列に整形されたデータが含まれます。例えば、次のようにします。

from pprint import pformat
formatted_output = pformat(users)
print(formatted_output)

文字列にデータを整形することで、出力をキレイに表示する上でより柔軟性が得られます。

再帰的なデータ構造の取り扱い

pprintは再帰的なデータ構造に対しても対応しています。再帰的なデータ構造は、自己参照の構造を持つデータを指します。例えば、次のようなデータ構造があります。

data = {
"name": "Alice",
"age": 30,
"children": [
{
"name": "Bob",
"age": 10,
"children": []
},
{
"name": "Charlie",
"age": 5,
"children": [
{
"name": "Dave",
"age": 2,
"children": []
}
]
}
]
}

このようなデータ構造をpprint()で表示すると、再帰的に展開されて表示されます。

pprint(data)
{'age': 30,
'children': [{'age': 10,
'children': [],
'name': 'Bob'},
{'age': 5,
'children': [{'age': 2,
'children': [],
'name': 'Dave'}],
'name': 'Charlie'}],
'name': 'Alice'}

このようにすることで、再帰的なデータ構造の表示も容易になります。

まとめ

Pythonのpprintモジュールを使用すると、データの整形や表示を効果的に行うことができます。このモジュールを使用することで、APIリクエストや大規模なデータ構造のデバッグなど、さまざまなシナリオでデータを見やすく表示することができます。

このチュートリアルでは、pprint()関数やPrettyPrinterクラスの使い方、オプション引数について学びました。さらに、pformat()関数を使用してフォーマットされた文字列を取得する方法や、再帰的なデータ構造の取り扱いについても説明しました。

データの整形や表示をキレイに行うために、pprintモジュールを活用してください。