Pregunta ¿Cómo hacer una bonita copia de un archivo JSON?


Tengo un archivo JSON que es un desastre que quiero imprimir bastante. ¿Cuál es la forma más fácil de hacerlo en Python? Sé que PrettyPrint toma un "objeto", que creo que puede ser un archivo, pero no sé cómo pasar un archivo, solo que usar el nombre de archivo no funciona.


585
2017-10-17 21:38


origen


Respuestas:


los json módulo ya implementa algunas impresiones básicas bonitas con el indent parámetro:

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

Para analizar un archivo, use json.load:

with open('filename.txt', 'r') as handle:
    parsed = json.load(handle)

942
2017-10-17 21:54



Puedes hacer esto en la línea de comando:

cat some.json | python -m json.tool

(como ya se mencionó en los comentarios a la pregunta).

En realidad, Python no es mi herramienta favorita en lo que respecta al procesamiento json en la línea de comando. Para una impresión sencilla y bonita, está bien, pero si desea manipular el json, puede llegar a complicarse demasiado. Pronto necesitaría escribir un archivo de secuencia de comandos separado, podría terminar con mapas cuyas claves son "alguna clave" (python Unicode), lo que hace que la selección de campos sea más difícil y realmente no va en la dirección de bastante -impresión.

yo suelo jq. Lo anterior se puede hacer con:

cat some.json | jq ''

y obtienes colores como bonificación (y una capacidad de extensión mucho más fácil).


184
2017-08-26 13:42



Pygmentize + Python json.tool = Bonita impresión con resaltado de sintaxis

Pygmentize es una herramienta arrolladora. Mira esto.

Yo combino python json.tool con pygramize

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

Vea el enlace de arriba para las instrucciones de instalación de pygramize.

Una demostración de esto está en la imagen a continuación:

demo


37
2017-08-27 10:30



Usa esta función y no te preocupes por tener que recordar si tu JSON es un str o dict de nuevo, solo mira la bonita impresión:

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)

29
2018-06-10 21:25



Podrías usar pprint.

Cómo leer el archivo con datos json e imprimirlo.

import json
import pprint

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

pprint.pprint(json_data)

15
2018-01-05 10:12



Para poder imprimir bastante desde la línea de comandos y poder tener control sobre la sangría, etc., puede configurar un alias similar a este:

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

Y luego usa el alias de una de estas maneras:

cat myfile.json | jsonpp
jsonpp < myfile.json

8
2018-03-28 14:58



Aquí hay un ejemplo simple de impresión bonita de JSON en la consola de una forma agradable en Python, sin que el JSON deba estar en su computadora como un archivo 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
2018-01-23 08:19