Как отпечатать JSON файл?

У меня есть файл JSON, который является беспорядком, который я хочу использовать для печати. ​​Какой самый простой способ сделать это в python? Я знаю, что PrettyPrint принимает "объект", который, я думаю, может быть файлом, но я не знаю, как передать файл... просто использование имени файла не работает.

+922
источник поделиться
12 ответов

Модуль json уже реализует некоторую простую красивую печать с параметром indent:

>>> import json
>>>
>>> your_json = '["foo", {"bar":["baz", null, 1.0, 2]}]'
>>> parsed = json.loads(your_json)
>>> print(json.dumps(parsed, indent=4, sort_keys=True))
[
    "foo", 
    {
        "bar": [
            "baz", 
            null, 
            1.0, 
            2
        ]
    }
]

Чтобы проанализировать файл, используйте json.load():

with open('filename.txt', 'r') as handle:
    parsed = json.load(handle)
+1430
источник

Вы можете сделать это в командной строке:

python3 -m json.tool < some.json

(как уже упоминалось в комментариях к вопросу, спасибо @Kai Petzke за предложение python3).

На самом деле python - не мой любимый инструмент в отношении обработки json в командной строке. Для простой красивой печати это нормально, но если вы хотите манипулировать json, это может стать слишком сложным. Вскоре вам понадобится написать отдельный скрипт файл, вы можете получить карты, ключи которых у вас "some-key" (Python Unicode), что делает выбор полей более сложным и на самом деле не идет в направлении довольно печать.

Я использую jq. Выше можно сделать с помощью:

jq . some.json

и вы получаете цвета в качестве бонуса (и значительно расширяемость).

Приложение: В комментариях есть некоторая путаница относительно использования jq для обработки больших файлов JSON, с одной стороны, и наличия очень большой jq-программы, с другой. Для красивой печати файла, состоящего из одного большого объекта JSON, практическим ограничением является ОЗУ. Для красивой печати файла объемом 2 ГБ, состоящего из одного массива реальных данных, "максимальный размер резидентного набора", необходимый для красивой печати, составлял 5 ГБ (с использованием jq 1.5 или 1.6). Также обратите внимание, что jq можно использовать из питона после pip install jq.

+283
источник
другие ответы

Связанные вопросы


Похожие вопросы

Pygmentize + Python json.tool = Красивая печать с подсветкой синтаксиса

Пигментирование является убийственным инструментом. Видеть это.

Я объединяю python json.tool с пигментированием

echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json

Смотрите ссылку выше для пигментирования инструкции по установке.

Демонстрация этого на изображении ниже:

demo

+47
источник

Вы можете использовать встроенный модуль pprint.

Как вы можете прочитать файл с данными JSON и распечатать его.

import json
import pprint

with open('filename.txt', 'r') as f:
    data = f.read()
    json_data = json.loads(data)

pprint.pprint(json_data)
+43
источник

Используйте эту функцию и не помните, если ваш JSON снова является str или dict - просто посмотрите на красивую печать:

import json

def pp_json(json_thing, sort=True, indents=4):
    if type(json_thing) is str:
        print(json.dumps(json.loads(json_thing), sort_keys=sort, indent=indents))
    else:
        print(json.dumps(json_thing, sort_keys=sort, indent=indents))
    return None

pp_json(your_json_string_or_dict)
+34
источник

Чтобы иметь возможность печатать из командной строки и иметь возможность контролировать отступ и т.д., вы можете настроить псевдоним, подобный этому:

alias jsonpp="python -c 'import sys, json; print json.dumps(json.load(sys.stdin), sort_keys=True, indent=2)'"

И затем используйте псевдоним одним из следующих способов:

cat myfile.json | jsonpp
jsonpp < myfile.json
+11
источник

Используйте pprint: https://docs.python.org/3.6/library/pprint.html

import pprint
pprint.pprint(json)

print() по сравнению с pprint.pprint()

print(json)
{'feed': {'title': 'W3Schools Home Page', 'title_detail': {'type': 'text/plain', 'language': None, 'base': '', 'value': 'W3Schools Home Page'}, 'links': [{'rel': 'alternate', 'type': 'text/html', 'href': 'https://www.w3schools.com'}], 'link': 'https://www.w3schools.com', 'subtitle': 'Free web building tutorials', 'subtitle_detail': {'type': 'text/html', 'language': None, 'base': '', 'value': 'Free web building tutorials'}}, 'entries': [], 'bozo': 0, 'encoding': 'utf-8', 'version': 'rss20', 'namespaces': {}}

pprint.pprint(json)
{'bozo': 0,
 'encoding': 'utf-8',
 'entries': [],
 'feed': {'link': 'https://www.w3schools.com',
          'links': [{'href': 'https://www.w3schools.com',
                     'rel': 'alternate',
                     'type': 'text/html'}],
          'subtitle': 'Free web building tutorials',
          'subtitle_detail': {'base': '',
                              'language': None,
                              'type': 'text/html',
                              'value': 'Free web building tutorials'},
          'title': 'W3Schools Home Page',
          'title_detail': {'base': '',
                           'language': None,
                           'type': 'text/plain',
                           'value': 'W3Schools Home Page'}},
 'namespaces': {},
 'version': 'rss20'}
+8
источник

Вот простой пример красивой печати JSON на консоль хорошим способом в Python, не требуя, чтобы JSON был на вашем компьютере в виде локального файла:

import pprint
import json 
from urllib.request import urlopen # (Only used to get this example)

# Getting a JSON example for this example 
r = urlopen("https://mdn.github.io/fetch-examples/fetch-json/products.json")
text = r.read() 

# To print it
pprint.pprint(json.loads(text))
+4
источник

Однажды я написал функцию prettyjson() красивый результат. Вы можете получить реализацию из этого репо.

Главной особенностью этой функции является то, что она пытается сохранять дикт и перечислять элементы в одну строку, пока maxlinelength будет достигнута определенная maxlinelength. Это дает меньше строк JSON, вывод выглядит более компактным и более легким для чтения.

Вы можете создать такой вывод, например:

{
  "grid": {"port": "COM5"},
  "policy": {
    "movingaverage": 5,
    "hysteresis": 5,
    "fan1": {
      "name": "CPU",
      "signal": "cpu",
      "mode": "auto",
      "speed": 100,
      "curve": [[0, 75], [50, 75], [75, 100]]
    }
}
+3
источник

Я думаю, что лучше разбирать json раньше, чтобы избежать ошибок:

def format_response(response):
    try:
        parsed = json.loads(response.text)
    except JSONDecodeError:
        return response.text
    return json.dumps(parsed, ensure_ascii=True, indent=4)
+1
источник

Вы можете попробовать pprintjson.


Установка

$ pip3 install pprintjson

Usage

UsageДовольно распечатать JSON из файла, используя CLI pprintjson.

$ pprintjson "./path/to/file.json"

Довольно распечатать JSON из стандартного ввода, используя CLI pprintjson.

$ echo '{ "a": 1, "b": "string", "c": true }' | pprintjson

Довольно распечатать JSON из строки, используя CLI pprintjson.

$ pprintjson -c '{ "a": 1, "b": "string", "c": true }'

Довольно распечатать JSON из строки с отступом 1.

$ pprintjson -c '{ "a": 1, "b": "string", "c": true }' -i 1

Довольно распечатать JSON из строки и сохранить вывод в файл output.json.

$ pprintjson -c '{ "a": 1, "b": "string", "c": true }' -o ./output.json

Выход

enter image description here

0
источник
def saveJson(date,fileToSave):
    with open(fileToSave, 'w+') as fileToSave:
        json.dump(date, fileToSave, ensure_ascii=True, indent=4)

Это работает, чтобы отобразить или сохранить его в файл.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос