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

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

Почему важно:
- Машины любят минифицированный JSON (меньше байт), люди — читаемый.
- Форматирование помогает найти ошибки структуры, пропущенные поля, неочевидные типы.
- Отформатированный JSON проще проверять в git diff и при ревью.
Как красиво вывести JSON в Python — пошагово
Ниже — подробный разбор двух подходов. Примеры работают в любом окружении Linux/macOS с Python 3.x, и в NeoVim (через :term) так же, как и в обычном терминале.
1. Подготовьте JSON-файл
Предположим, у вас есть файл addresses.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 (стриминг) | Поддержка больших файлов | Сложнее код, итеративный парсинг |
Практическая методология — шаги для задачи «прочитать и отформатировать»
- Проверить валидность JSON (
python -m json.toolбыстро показывает ошибки). - Оценить размер файла — если < несколько сотен МБ, можно загружать; иначе — стриминг.
- Выбрать формат вывода: терминал / файл / публичный лог.
- Выключить вывод секретов, использовать ensure_ascii=False при необходимости.
- Сохранить результат в отдельный файл и проверять в 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.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента