J'ai un fichier JSON qui est un gâchis que je veux imprimer - quel est le moyen le plus simple de le faire en python? Je sais que PrettyPrint prend un "objet", qui peut être un fichier, mais je ne sais pas comment passer un fichier - utiliser le nom de fichier ne fonctionne pas.
Le module json
implémente déjà quelques jolies impressions de base avec le paramètre 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
]
}
]
Pour analyser un fichier, utilisez json.load()
:
with open('filename.txt', 'r') as handle:
parsed = json.load(handle)
Vous pouvez le faire sur la ligne de commande:
python3 -m json.tool < some.json
(comme déjà mentionné dans les commentaires sur la question, merci à @Kai Petzke pour la suggestion de python3).
En fait, python n'est pas mon outil préféré en ce qui concerne le traitement JSON sur la ligne de commande. Pour une impression simple, jolies c'est bien, mais si vous voulez manipuler le JSON, cela peut devenir trop compliqué. Bientôt, vous aurez besoin d'écrire un fichier de script séparé. Vous pourriez vous retrouver avec des maps dont les clés sont "une clé" (python unicode), ce qui rend la sélection de champs plus difficile et ne va pas vraiment dans le sens de jolie. -impression.
J'utilise jq . Ce qui précède peut être fait avec:
jq . some.json
et vous obtenez des couleurs en bonus (et une extensibilité beaucoup plus facile).
Addendum: Il y a une certaine confusion dans les commentaires sur l'utilisation de jq pour traiter des fichiers JSON volumineux, d'une part, et sur l'existence d'un très grand programme jq, de l'autre. Pour imprimer en beauté un fichier constitué d'une seule et grande entité JSON, la limitation pratique est la mémoire vive. Pour une jolie impression d'un fichier de 2 Go constitué d'un seul tableau de données réelles, la "taille maximale du groupe de résidents" requise pour l'impression jolie était de 5 Go (que vous utilisiez jq 1.5 ou 1.6). Notez également que jq peut être utilisé depuis python après pip install jq
.
Pygmentize est un outil tueur. Voir ceci.
Je combine python json.tool avec pygmentize
echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json
Voir le lien ci-dessus pour les instructions d'installation de pygmentize.
Une démo de ceci est dans l'image ci-dessous:
Vous pouvez utiliser le module intégré pprint .
Comment vous pouvez lire le fichier avec les données JSON et l'imprimer.
import json
import pprint
with open('filename.txt', 'r') as f:
data = f.read()
json_data = json.loads(data)
pprint.pprint(json_data)
Utilisez cette fonction et évitez de vous rappeler si votre JSON est un str
ou dict
à nouveau - il suffit de regarder le joli imprimé:
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)
Pour pouvoir imprimer depuis la ligne de commande et pouvoir contrôler l'indentation, etc., vous pouvez configurer un alias similaire à celui-ci:
alias jsonpp="python -c 'import sys, json; print json.dumps(json.load(sys.stdin), sort_keys=True, indent=2)'"
Et utilisez ensuite le pseudonyme de l'une des manières suivantes:
cat myfile.json | jsonpp
jsonpp < myfile.json
Utilisez pprint: https://docs.python.org/3.6/library/pprint.html
import pprint
pprint.pprint(json)
print()
par rapport à 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'}
Voici un exemple simple de jolie impression JSON sur la console de manière agréable en Python, sans exiger que le JSON soit sur votre ordinateur en tant que fichier local:
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))
Une fois, j'ai écrit une fonction prettyjson()
pour produire une sortie agréable. Vous pouvez récupérer l'implémentation de ce repo .
La fonction principale de cette fonction est d’essayer de conserver les éléments dict et list sur une seule ligne jusqu’à atteindre un certain maxlinelength
. Cela produit moins de lignes de JSON, la sortie est plus compacte et plus facile à lire.
Vous pouvez produire ce type de sortie par exemple:
{
"grid": {"port": "COM5"},
"policy": {
"movingaverage": 5,
"hysteresis": 5,
"fan1": {
"name": "CPU",
"signal": "cpu",
"mode": "auto",
"speed": 100,
"curve": [[0, 75], [50, 75], [75, 100]]
}
}
Je pense que c'est mieux d'analyser le json avant, pour éviter les erreurs:
def format_response(response):
try:
parsed = json.loads(response.text)
except JSONDecodeError:
return response.text
return json.dumps(parsed, ensure_ascii=True, indent=4)