У меня есть файл JSON, который является беспорядком, который я хочу использовать для печати. Какой самый простой способ сделать это в python? Я знаю, что PrettyPrint принимает "объект", который, я думаю, может быть файлом, но я не знаю, как передать файл... просто использование имени файла не работает.
Модуль 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)
print json.dumps(your_json_string, indent=4)
Вы можете сделать это в командной строке:
python3 -m json.tool < some.json
(как уже упоминалось в комментариях к вопросу, спасибо @Kai Petzke за предложение python3).
На самом деле python - не мой любимый инструмент в отношении обработки json в командной строке. Для простой красивой печати это нормально, но если вы хотите манипулировать json, это может стать слишком сложным. Вскоре вам нужно будет написать отдельный скрипт файл, вы можете получить карты, ключи которых у вас "some-key" (юникод python), что делает выбор полей более сложным и на самом деле не идет в направлении довольно Печатание.
Я использую JQ. Выше может быть сделано с:
jq '' < some.json
и вы получаете цвета в качестве бонуса (и это значительно расширяет возможности).
Пигментирование является убийственным инструментом. Видеть это.
Я объединяю python json.tool с пигментированием
echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json
Смотрите ссылку выше для пигментирования инструкции по установке.
Демонстрация этого на изображении ниже:
-g
самом деле не работает;) Поскольку входные данные поступают из stdin, pygmentize не может сделать правильное предположение. Вам нужно явно указать лексер: echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json
Используйте эту функцию и не помните, если ваш 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)
Вы можете использовать встроенный 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)
Чтобы иметь возможность печатать из командной строки и иметь возможность контролировать отступ и т.д., вы можете настроить псевдоним, подобный этому:
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
Вот простой пример красивой печати 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))
json.loads()
и распечатать полученный словарь. Или просто перейдите в раздел печати Pretty документации Python дляjson
.