Ho un file JSON che è un disastro che voglio fare con prettyprint - qual è il modo più semplice per farlo in python? So che PrettyPrint prende un "oggetto", che a mio avviso può essere un file, ma non so come passare un file in-- basta usare il nome del file non funziona.Come stampare un file JSON?
risposta
Il modulo json
implementa già un po 'di stampa piuttosto semplice con il parametro 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
]
}
]
di analizzare un file, utilizzare json.load
:
with open('filename.txt', 'r') as handle:
parsed = json.load(handle)
Si può fare questo sulla riga di comando:
cat some.json | python -m json.tool
(come già m inserito nei commenti alla domanda).
In realtà Python non è il mio strumento preferito per quanto riguarda l'elaborazione JSON sulla riga di comando. Per la semplice stampa carina è ok, ma se vuoi manipolare il json può diventare complicato. Avresti presto bisogno di scrivere un file di script separato, potresti finire con mappe le cui chiavi sono "some-key" (python unicode), il che rende la selezione dei campi più difficile e non va nella direzione di pretty -stampa.
Io uso jq. Quanto sopra può essere fatto con:
cat some.json | jq ''
e si ottengono colori come bonus (e modo più facile estensibilità).
JQ è ottimo ma c'è un limite massimo quindi è inutile per file di grandi dimensioni. (es. esplode maneggiando un file da 1.15mb) https://github.com/stedolan/jq/issues/1041 –
sì, amico, sicuramente, se stai scrivendo filtri jq con più di 10K di codice penso che tu sia stai provando qualcosa come andare su Marte con una bicicletta. –
lol: D @ gismo-ranas La versione json.tool collegata a un file funziona davvero molto bene su file di grandi dimensioni; ed è stupidamente veloce. Mi piace JQ ma la formattazione di qualsiasi cosa oltre un piccolo carico utile (che si potrebbe fare nella maggior parte degli editor di testo) è fuori dalla sua portata :) Aggiunta casuale: http://www.json-generator.com/ è uno strumento accurato per creare dati di test –
pygmentize + Python json.tool = Abbastanza Stampa con evidenziazione della sintassi
pygmentize è uno strumento assassino. See this.
combino pitone json.tool con pygmentize
echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json
Vedi il link qui sopra per istruzioni di installazione pygmentize.
Una demo di questo è nell'immagine qui sotto:
Nel tuo esempio '-g' in realtà non funziona;) Poiché l'input proviene da stdin, pygmentize non è in grado di fare una buona ipotesi. È necessario specificare esplicitamente il lexer: 'echo '{" foo ":" bar "}' | python -m json.tool | pygmentize -l json' –
@DenisTheMenace Funzionava nel 2015 quando ho creato questa immagine di esempio. Non sembra che funzioni ora anche sul mio sistema. –
Usare questa funzione e non sudare dover ricordare se il vostro è un JSON str
o dict
ancora - basta guardare la bella stampa :
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)
per essere in grado di stampare praticamente dalla linea di comando e di essere in grado di avere il controllo su l'indentazione, ecc è possibile impostare un alias simile a questo:
alias jsonpp="python -c 'import sys, json; print json.dumps(json.load(sys.stdin), sort_keys=True, indent=2)'"
e quindi utilizzare l'alias in uno dei seguenti modi:
cat myfile.json | jsonpp
jsonpp < myfile.json
Si potrebbe utilizzare pprint.
Come leggere il file con dati json e stamparlo.
import json
import pprint
with open('filename.txt', 'r') as f:
json_data = json.load(f.read())
pprint.pprint(json_data)
Ecco un semplice esempio di stampa piuttosto JSON per la console in un bel modo in Python, senza richiedere l'JSON di essere sul computer come un file locale:
Ottengo il seguente messaggio di errore in Python 3: "TypeError: l'oggetto JSON deve essere str, non 'byte'" – MrT
Cercare di analizzare il JSON usando 'json.loads()' e stampiamo il dizionario risultante. Oppure vai alla sezione ** Pretty printing ** di Python [documentazione per 'json'] (http://docs.python.org/library/json.html). – Blender
http://stackoverflow.com/questions/352098/how-to-pretty-print-json-script –
@Blender se pubblichi una risposta ti darò credito ... questo potrebbe essere chiuso come duplicato, perché la soluzione è la stessa, ma la domanda è diversa, quindi forse no. – Colleen