it-roy-ru.com

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

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

823
Colleen

Модуль 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)
1278
Blender

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

python3 -m json.tool < some.json

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

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

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

jq '' < some.json

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

256
Gismo Ranas

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

Пигментирование является убийственным инструментом. см. Это.

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

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

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

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

demo

44
Shubham Chaudhary

Вы можете использовать встроенный модуль 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)
37
ikreb

Используйте эту функцию и не беспокойтесь о необходимости помнить, что ваш 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)
32
zelusp

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

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
9
V P

Используйте 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'}
4
Nakamoto

Вот простой пример приятной печати 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
David Liu

Я думаю, что лучше разбирать 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
p3quod

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

Главная особенность этой функции заключается в том, что она пытается сохранить весть и список элементов в одной строке, пока не будет достигнуто определенное 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]]
    }
}
0
Andy