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

Как использовать/исправить python pretty printer?

[

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

pprint_Watermarked.a3e409650f59.jpeg)

Автор: Ian Currie


Когда дело доходит до работы с данными в Python, создание читаемого вывода структур данных иногда может быть сложной задачей. Компьютеры не обращают внимания на форматирование, но людям трудно читать данные без хорошего форматирования. Использование функции print() для вывода больших словарей или длинных списков может быть эффективным, но не всегда красивым.

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

По окончании этого руководства вы:

  • Поймете, почему модуль pprint в Python - необходим
  • Узнаете, как использовать функции pprint(), PrettyPrinter и их параметры
  • Сможете создавать свой экземпляр класса PrettyPrinter
  • Сможете сохранять отформатированный вывод в виде строк, а не просто выводить его на экран
  • Узнаете, как работать с рекурсивными структурами данных

Бесплатный бонус: Нажмите здесь, чтобы получить Памятку по Python и изучить основы Python 3, такие как работа с типами данных, словарями, списками и функциями Python.

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

Прежде чем использовать pprint, мы сначала будем использовать urllib для выполнения запроса и получения данных. Мы сделаем запрос к API {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 в наш код и воспользуемся его функцией 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': {'bs': 'harness real-time e-markets',
'catchPhrase': 'Multi-layered client-server neural-net',
'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 позволяет ограничить глубину вывода структуры данных. Если ваша структура данных имеет множество вложенных уровней, вы можете использовать этот параметр, чтобы предотвратить слишком длинные выводы.

Для использования параметра depth, передайте целое число в качестве аргумента:

pprint(users, depth=2)

Теперь вывод будет содержать только первые два уровня вложенности структуры данных:

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

Отступы в данных: indent

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

Давайте увеличим значение indent до 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': {'bs': 'harness real-time e-markets',
'catchPhrase': 'Multi-layered client-server neural-net',
'name': 'Romaguera-Crona'},
'email': 'Sincere@april.biz',
'id': 1,
'name': 'Leanne Graham',
'phone': '1-770-736-8031 x56442',
'username': 'Bret',
'website': 'hildegard.org'}]

Увеличение количества пробелов в отступах делает вывод еще более читаемым.

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

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

pprint(users, width=80)

Теперь строка не будет превышать 80 символов:

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

Сжатие длинных последовательностей: compact

Параметр compact позволяет сжимать длинные последовательности (списки или словари) на одной строке, вместо переноса их по нескольким строкам.

pprint(users, compact=True)

Теперь длинная последовательность будет выглядеть следующим образом:

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

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

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

Создадим файл output.txt и укажем его в качестве значения параметра stream:

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

Теперь данные будут записаны в файл output.txt, а не выводиться на экран.

Предотвращение сортировки словарей: sort_dicts

Структуры данных типа словарь не имеют порядка элементов по умолчанию. Однако, параметр sort_dicts позволяет упорядочить элементы словаря по алфавиту.

pprint(users, sort_dicts=True)

Теперь элементы словаря будут отсортированы по алфавиту ключей:

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

Улучшение вывода чисел: underscore_numbers

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

pprint(users, underscore_numbers=True)

Теперь числа будут выглядеть следующим образом:

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

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

Модуль pprint также позволяет создать собственный объект PrettyPrinter, который может быть настроен по вашим потребностям.

from pprint import PrettyPrinter
printer = PrettyPrinter(indent=2, width=80)
printer.pprint(users)

Теперь мы можем использовать этот объект для красивого вывода данных по нашим параметрам:

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

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

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

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

Функция pformat() возвращает отформатированную строку, которую мы можем сохранить в переменную и использовать по своему усмотрению.

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

Модуль pprint также способен обрабатывать рекурсивные структуры данных. Рекурсия возникает, когда объект ссылается на самого себя. Давайте создадим простой класс Node, который будет иметь ссылку на другой объект Node:

class Node:
def __init__(self, value):
self.value = value
self.next = None
a = Node(1)
b = Node(2)
c = Node(3)
a.next = b
b.next = c
c.next = a
pprint(a)

Модуль pprint понимает рекурсивные ссылки и обрабатывает их без ошибок. Вот что будет выведено:

<__main__.Node object at 0x7f8d18ffe438>
value: 1
next: <__main__.Node object at 0x7f8d18ffe550>
value: 2
next: <__main__.Node object at 0x7f8d18ffe5c0>
value: 3
next: <__main__.Node object at 0x7f8d18ffe438>

Обратите внимание, что ссылка next на объект Node повторяет саму себя.

Заключение

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

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