Гид по технологиям

Как красиво вывести JSON в Python

• 6 min read • Python • Обновлено 28 Nov 2025
Как красиво вывести JSON в Python
Как красиво вывести JSON в Python

Набор кистей для макияжа, иллюстрация к заметке о форматировании данных.

Python отлично работает с JSON — JavaScript Object Notation. Вы можете прочитать JSON из файла или потока, распарсить его и вывести в удобочитаемой форме. Это удобно, когда исходный файл «минифицирован» (весь в одной строке) или когда данные нужно проверить вручную.

Что такое pretty print и зачем это нужно

Коротко: pretty print берет «сырые» данные и делает их читабельными — добавляет отступы, переносы строк, опционально сортирует ключи. Часто это нужно при отладке, ревью данных или для экспорта человеку.

Пример отформатированных данных в Neovim.

Почему важно:

  • Машины любят минифицированный JSON (меньше байт), люди — читаемый.
  • Форматирование помогает найти ошибки структуры, пропущенные поля, неочевидные типы.
  • Отформатированный JSON проще проверять в git diff и при ревью.

Как красиво вывести JSON в Python — пошагово

Ниже — подробный разбор двух подходов. Примеры работают в любом окружении Linux/macOS с Python 3.x, и в NeoVim (через :term) так же, как и в обычном терминале.

1. Подготовьте JSON-файл

Предположим, у вас есть файл addresses.json с минифицированными данными (всё в одной строке). Мы будем читать его и выводить в формате с отступами:

Дамп JSON-контента без форматирования.

2. Откройте JSON-файл в Python

Импортируйте модуль json и откройте файл стандартной конструкцией with open:

import json

json_file = 'addresses.json'

with open(json_file, 'r', encoding='utf-8') as file:
    parsed = json.load(file)

Простое определение: json.load читает JSON из файлового объекта и возвращает питоновский объект (dict/list).

3. Pretty print — базовый пример

Самый простой вывод в терминал с отступом 4 пробела и сортировкой ключей:

print(json.dumps(parsed, indent=4, sort_keys=True))

Разбор аргументов json.dumps:

  • Первый аргумент — объект Python (словарь или список), полученный через json.load.
  • indent — количество пробелов в отступе (может быть число или строка, например “\t”).
  • sort_keys — если True, ключи словарей будут отсортированы по алфавиту.
  • ensure_ascii — по умолчанию True; если вам нужно видеть кириллицу как есть, используйте ensure_ascii=False.

Пример с сохранением в файл и корректной кодировкой:

with open('pretty_addresses.json', 'w', encoding='utf-8') as out:
    json.dump(parsed, out, indent=4, sort_keys=True, ensure_ascii=False)

Это запишет отформатированный JSON в новый файл.

4. Быстрая команда в терминале (однострочник)

Если нужно быстро увидеть форматированный JSON без написания скрипта, можно использовать модуль json.tool:

cat addresses.json | python3 -m json.tool

Или, эквивалентно:

python3 -m json.tool addresses.json

Этот способ полезен для мгновенной проверки или в пайплайне команд.

Подробные советы по опциям и кодировке

  • ensure_ascii=False — сохраняет Unicode-символы без экранирования \uXXXX; удобно для русских текстов.
  • separators=(‘,’, ‘: ‘) — можно точнее контролировать пробелы после запятой и двоеточия.
  • indent=”\t” — использовать табуляцию вместо пробелов.

Пример с ensure_ascii:

json.dumps(parsed, indent=2, ensure_ascii=False)

Когда подход с json.dumps/json.tool не подходит (ограничения)

Important: есть кейсы, когда pretty print в памяти не сработает:

  • Огромные файлы (несколько гигабайт) — чтение в память через json.load приведет к OOM. Для них лучше стримовый подход или инструменты, работающие построчно (см. ndjson/ijson).
  • Невалидный JSON — json.load упадет с исключением JSONDecodeError; сначала проверьте валидность.
  • Новые бинарные форматы внутри JSON (base64) — они будут красиво распечатаны, но содержимое бесполезно для чтения.

Альтернативные инструменты и подходы

  • jq — мощный инструмент командной строки для обработки и форматирования JSON: jq . addresses.json.
  • Встроенные средства редакторов: VS Code, Sublime, Neovim (плагины) умеют форматировать JSON.
  • Потоковый парсинг: ijson для Python для обработки больших файлов по частям.

Сравнение подходов (краткая матрица):

ПодходПлюсыМинусы
json.dumps / json.dumpПростота, полный контроль, работает в скриптахТребует загрузки в память (не для больших файлов)
python -m json.toolБыстро, без кодаМинимальные настройки, не сохраняет в файл (можно перенаправить)
jqОчень быстро, мощные фильтрыНужно изучить синтаксис, отдельный бинарник
ijson (стриминг)Поддержка больших файловСложнее код, итеративный парсинг

Практическая методология — шаги для задачи «прочитать и отформатировать»

  1. Проверить валидность JSON (python -m json.tool быстро показывает ошибки).
  2. Оценить размер файла — если < несколько сотен МБ, можно загружать; иначе — стриминг.
  3. Выбрать формат вывода: терминал / файл / публичный лог.
  4. Выключить вывод секретов, использовать ensure_ascii=False при необходимости.
  5. Сохранить результат в отдельный файл и проверять в VCS.

Ролевые чеклисты

Разработчик:

  • Проверил JSON на валидность.
  • Использовал ensure_ascii=False для локализации, если нужно.
  • Сохранил отформатированный файл в артефакты/артефакт-хранилище.

Системный администратор / DevOps:

  • Не отправляет отформатированный JSON в публичные логи без маскирования секретов.
  • Для больших логов настроил ротацию и компрессию.

Аналитик данных:

  • Проверил структуру (ключи/тип полей).
  • Привел примеры выборочных записей в отформатированный файл для команды.

Мини-шпаргалка — часто используемые сниппеты

Печать в терминал, кириллица:

print(json.dumps(parsed, indent=2, ensure_ascii=False))

Запись с табуляцией:

with open('out.json', 'w', encoding='utf-8') as f:
    json.dump(parsed, f, indent='\t', ensure_ascii=False)

Стримовый вывод для больших файлов (ijson, пример простого использования):

import ijson
with open('big.json', 'r', encoding='utf-8') as f:
    for prefix, event, value in ijson.parse(f):
        # обработка по событиям
        pass

Безопасность и приватность

Важно: не выводите в красивом виде JSON, содержащий секреты, токены, пароли, PII, в публичные логи или в баг-трекер. Маскируйте поля перед выводом:

def mask_secrets(obj):
    # простая рекурсивная маска ключей с 'token' или 'password'
    pass

Также учитывайте кодировку: сохраняйте файлы в UTF-8, чтобы не получить экранированные последовательности.

Диагностика ошибок — быстрый список

  • JSONDecodeError при json.load: проверьте лишние запятые, неправильные кавычки, непарные скобки.
  • Пустой вывод в терминале: убедитесь, что вы действительно печатаете объект, а не None.
  • Память закончилась: переходите на стримовую обработку или используйте инструменты, работающие по частям (jq, ijson).

Критерии приёмки

  • Выходной файл корректно парсится обратно через json.load.
  • Форматирование соответствует заданному indent и ensure_ascii.
  • Для CLI-решения — команда завершается без ошибок и вывод читаем человеком.

Частые вопросы (1‑строчные ответы)

  • Как сохранить кириллицу неперекодированной? — Используйте ensure_ascii=False и UTF-8.
  • Можно ли отсортировать ключи? — Да, параметр sort_keys=True.
  • Как форматировать NDJSON (строки JSON подряд)? — Обрабатывать построчно, форматируя каждую строку отдельно.

Краткое резюме

  • Для большинства задач достаточно json.dumps/json.dump или python3 -m json.tool.
  • Для больших файлов выбирайте стриминг или jq.
  • Всегда думайте о безопасности: не публикуйте секреты.

Вывод терминала с отформатированными данными.

Если хотите — добавьте в комментариях ваш сценарий (размер файла, цель — отладка или экспорт), и я помогу подобрать оптимальный инструмент и команду.


Краткие определения (глоссарий):

  • pretty print: форматирование данных для удобства чтения человеком.
  • json.load / json.loads: функции для парсинга JSON в объекты Python.
  • json.dump / json.dumps: функции для сериализации Python-объектов обратно в JSON.
  • ndjson: newline-delimited JSON, каждый объект на отдельной строке.

Спасибо за чтение — надеюсь, это ускорит вашу работу с JSON в Python.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро