web-dev-qa-db-fra.com

Comment prettyprint un fichier JSON?

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.

896
Colleen

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)
1382
Blender

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.

275
Gismo Ranas

Pygmentize + Python json.tool = Jolie impression avec mise en surbrillance de la syntaxe

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:

demo

46
Shubham Chaudhary

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)
41
ikreb

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)
33
zelusp

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

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'}
7
Nakamoto

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))
4
David Liu

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]]
    }
}
3
Andy

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)
1
p3quod