Пропустить до содержимого

Как использовать pprint для красивого вывода данных?

[

Красивый вывод структур данных в Python с помощью pprint

by Ian Currie

Понимание необходимости красивого вывода в Python

Прежде чем приступить к изучению pprint, вы сначала будете использовать модуль urllib, чтобы выполнить запрос и получить некоторые данные. Вы сделаете запрос к 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)
[{'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
Однако, как вы видите, вывод словаря не отформатирован и нечитаем. Именно здесь приходит на помощь модуль `pprint`.
## Работа с pprint
Модуль `pprint` предоставляет функцию `pprint()`, которая позволяет выводить структуры данных в красивом формате с отступами и переносами строк. Вот пример использования `pprint()` с нашим словарем пользователей:
```python
import pprint
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',
'name': 'Romaguera-Crona'},
'email': 'Sincere@april.biz',
'id': 1,
'name': 'Leanne Graham',
'phone': '1-770-736-8031 x56442',
'username': 'Bret',
'website': 'hildegard.org'},
...
]

Как вы видите, вывод структуры данных стал более приятным для чтения благодаря отступам и переносам строк.

Изучение необязательных параметров pprint()

pprint() также позволяет использовать дополнительные необязательные параметры для настройки вывода.

Суммирование данных: глубина

Параметр depth позволяет управлять глубиной вывода структуры данных. Вы можете задать максимальное количество вложенных уровней, которые должны быть отображены. Если установить depth=1, то будут отображены только первый уровень вложенности:

pprint.pprint(users, depth=1)

Вывод:

[{'address': {...},
'company': {...},
'email': 'Sincere@april.biz',
'id': 1,
'name': 'Leanne Graham',
'phone': '1-770-736-8031 x56442',
'username': 'Bret',
'website': 'hildegard.org'},
...
]

Как видно, все вложенные структуры данных были заменены многоточием {...}.

Отступ

Параметр indent задает количество пробелов для каждого уровня вложенности. По умолчанию используется значение indent=1. Если установить значение indent=4, то отступы будут больше:

pprint.pprint(users, indent=4)

Вывод:

[{'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'},
'email': 'Sincere@april.biz',
'id': 1,
'name': 'Leanne Graham',
'phone': '1-770-736-8031 x56442',
'username': 'Bret',
'website': 'hildegard.org'},
...
]

Теперь вы видите, что отступы состоят из 4 пробелов для каждого уровня вложенности.

Ограничение длины строк

Параметр width позволяет ограничить длину выводимых строк. Если строка превышает указанное значение, она будет разбита на несколько строк. По умолчанию значение width не задано. Вот пример с ограниченной длиной строк width=40:

pprint.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'},
'email': 'Sincere@april.biz',
'id': 1,
'name': 'Leanne Graham',
'phone': '1-770-736-8031 x56442',
'website': 'hildegard.org'},
...
]

Вы можете видеть, что строки в словаре разбиты на несколько строк, чтобы удержаться в пределах ширины в 40 символов.

Уплотнение длинных последовательностей

Параметр compact позволяет управлять выводимым форматом для длинных последовательностей, таких как списки или кортежи. Если установить значение compact=True, то длинные последовательности будут выводиться в строчку, без добавления новых строк:

pprint.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', 'name': 'Romaguera-Crona'}, 'email': 'Sincere@april.biz', 'id': 1, 'name': 'Lean

Как вы видите, все последовательности выводятся в одну строку без переносов.

Направление вывода: поток

Параметр stream позволяет указать файл, в который будет осуществляться вывод. По умолчанию, вывод происходит в стандартный поток вывода sys.stdout. Однако, вы можете указать свой собственный файл, например:

with open('output.txt', 'w') as f:
pprint.pprint(users, stream=f)

В этом примере вывод будет записан в файл output.txt вместо стандартного потока вывода.

Отключение сортировки словарей

По умолчанию, pprint сортирует ключи словарей перед выводом. Если вы хотите сохранить исходный порядок ключей, вы можете установить параметр sort_dicts=False:

pprint.pprint(users, sort_dicts=False)

Красивый вывод чисел

Параметр underscore_numbers позволяет добавлять подчеркивание для разделения цифр в больших числах для лучшей читаемости:

pprint.pprint(users, underscore_numbers=True)

Как видно, большие числа разделены подчеркиванием для повышения читаемости.

Создание собственного объекта PrettyPrinter

Вы также можете создать свой экземпляр объекта PrettyPrinter с настройками по умолчанию или своими собственными:

import pprint
pp = pprint.PrettyPrinter(indent=4, width=40, compact=True)
pp.pprint(users)

Таким образом, вы можете более детально настроить вывод структуры данных в соответствии с вашими потребностями.

Получение красивой строки с помощью pformat()

Метод pformat() модуля pprint позволяет получить красиво отформатированную строку вместо вывода на экран. Вот пример использования:

import pprint
pretty_string = pprint.pformat(users)
print(pretty_string)

Теперь вы можете сохранить красивую отформатированную строку в переменной pretty_string и использовать ее по своему усмотрению.

Обработка рекурсивных структур данных

pprint способен обрабатывать рекурсивные структуры данных, такие как вложенные списки или словари. Он распознает эти структуры и избегает зацикливания. Вот пример использования:

data = ['item']
data.append(data)
pprint.pprint(data)

Вывод:

['item', <Recursion on list with id=140039267399712>]

Обратите внимание, что pprint распознает рекурсивную ссылку и заменяет ее на <Recursion on list with id=...>, чтобы избежать бесконечного вывода.

Заключение

Модуль pprint в Python предоставляет удобный способ вывода структур данных в красивом формате. Он полезен при исследовании данных, отладке и работе с API запросами, JSON файлами и другими сложными структурами данных. Знание и использование pprint позволяет делать вывод более читаемым и удобным для анализа.