Dati JSON abbastanza stampati su un file utilizzando Python


111

Un progetto per la classe implica l'analisi dei dati JSON di Twitter. Ricevo i dati e li imposto sul file senza troppi problemi, ma è tutto in una riga. Questo va bene per la manipolazione dei dati che sto cercando di fare, ma il file è incredibilmente difficile da leggere e non posso esaminarlo molto bene, rendendo molto difficile la scrittura del codice per la parte di manipolazione dei dati.

Qualcuno sa come farlo dall'interno di Python (cioè non usando lo strumento della riga di comando, che non riesco a far funzionare)? Ecco il mio codice finora:

header, output = client.request(twitterRequest, method="GET", body=None,
                            headers=None, force_auth_header=True)

# now write output to a file
twitterDataFile = open("twitterData.json", "wb")
# magic happens here to make it pretty-printed
twitterDataFile.write(output)
twitterDataFile.close()

Nota Apprezzo le persone che mi indirizzano alla documentazione simplejson e simili, ma come ho affermato, l'ho già esaminato e continuo ad aver bisogno di assistenza. Una risposta veramente utile sarà più dettagliata ed esplicativa degli esempi che si trovano lì. Grazie

Inoltre: provando questo nella riga di comando di Windows:

more twitterData.json | python -mjson.tool > twitterData-pretty.json

risultati in questo:

Invalid control character at: line 1 column 65535 (char 65535)

Ti darei i dati che sto usando, ma sono molto grandi e hai già visto il codice che ho usato per creare il file.


1
Dubito che tu voglia effettivamente scrivere dati binari ("wb")
Hamish

Mi è stato insegnato che questo era necessario per le macchine Windows e finora ha funzionato per tutti i miei incarichi. Se puoi offrire la documentazione sul motivo per cui questo potrebbe essere errato, sarei felice di esaminarlo.
Zelbinian

È necessario solo se si lavora con file binari o altri casi in cui è importante la forma specifica della fine della riga (es. \r\nVs \n). Vedi stackoverflow.com/questions/3257869/… . Nel tuo caso, desideri terminazioni di riga amichevoli per Windows, ma potresti non ottenerle dall'endpoint di Twitter, quindi dovresti aprire in modalità testo.
Hamish

Questo risponde alla tua domanda? Come stampare un file JSON?
wesinat0r

Risposte:


102

Dovresti usare l'argomento facoltativo indent.

header, output = client.request(twitterRequest, method="GET", body=None,
                            headers=None, force_auth_header=True)

# now write output to a file
twitterDataFile = open("twitterData.json", "w")
# magic happens here to make it pretty-printed
twitterDataFile.write(simplejson.dumps(simplejson.loads(output), indent=4, sort_keys=True))
twitterDataFile.close()

1
Grazie, ha funzionato perfettamente . Puoi spiegare perché "sort_keys" deve essere presente?
Zelbinian

1
Non è necessario che sia lì, ma rende le cose molto carine e ordinate alfabeticamente. Tendo a usarlo quando voglio un output leggibile dall'uomo.
mattbornski

4
Ben spiegato grazie, tuttavia non cercare di essere un & $ & # ma aprire / chiudere per scrivere un file non è incoraggiato, la struttura with è generalmente preferibile: il with open("name_of_file.json", "w") as f: f.write(my_formatted_json_var) vantaggio di essere sicuri che il file si chiuderà, ad esempio su frammenti più grandi ...
logicOnAbstractions

withla sintassi è decisamente migliore, ma cerco di
adattare le

73

Puoi analizzare il JSON, quindi visualizzarlo di nuovo con rientri come questo:

import json
mydata = json.loads(output)
print json.dumps(mydata, indent=4)

Vedi http://docs.python.org/library/json.html per maggiori informazioni.


@Zelbinian: sì, funziona anche per simplejson. Dai un'occhiata qui simplejson.googlecode.com/svn/tags/simplejson-1.9.1/docs/…
RanRag

Ciò si traduce in un file vuoto. header, output = client.request(twitterRequest, method="GET", body=None, headers=None, force_auth_header=True) twitterDataFile = open("twitterData.json", "wb") json.dumps(json.loads(output), twitterDataFile, indent=4) twitterDataFile.close()
Zelbinian

5
@Zelbinian - json.dumpsrestituisce una stringa. json.dumpscrive su un file.
dkamins

65
import json

with open("twitterdata.json", "w") as twitter_data_file:
    json.dump(output, twitter_data_file, indent=4, sort_keys=True)

Non è necessario json.dumps()se non si desidera analizzare la stringa in un secondo momento, basta semplicemente usare json.dump(). È anche più veloce.


14

Puoi usare il modulo json di python per una bella stampa.

>>> import json
>>> print json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
{
    "4": 5,
    "6": 7
}

Quindi, nel tuo caso

>>> print json.dumps(json_output, indent=4)

Ho provato quella strada e sfortunatamente non funziona come penseresti.
Zelbinian

@ Zelbinian: Exactky cosa intendi con doesn't work as well.?
RanRag

1
Ha emesso i dati in una singola riga in quella che sembrava essere la sintassi dei dict di Python invece della sintassi Json piuttosto stampata
Zelbinian

Includi l'output nella tua domanda come una modifica, così possiamo vederlo.
RanRag

usando questo, gli array sono elencati come molte righe di ogni valore, sarebbe bello mantenere l'array su una riga.
scape il

4

Se hai già file JSON esistenti che vuoi formattare abbastanza, puoi usare questo:

    with open('twitterdata.json', 'r+') as f:
        data = json.load(f)
        f.seek(0)
        json.dump(data, f, indent=4)
        f.truncate()

3

Se stai generando un nuovo * .json o modificando il file josn esistente, usa il parametro "indent" per il formato json di visualizzazione graziosa.

import json
responseData = json.loads(output)
with open('twitterData.json','w') as twitterDataFile:    
    json.dump(responseData, twitterDataFile, indent=4)

1
import json
def writeToFile(logData, fileName, openOption="w"):
  file = open(fileName, openOption)
  file.write(json.dumps(json.loads(logData), indent=4)) 
  file.close()  

Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo sul perché e / o come questo codice risponde alla domanda ne migliora il valore a lungo termine.
Tân

-2

Puoi reindirizzare un file a python e aprirlo usando lo strumento e per leggerlo usarne di più.

Il codice di esempio sarà,

cat filename.json | python -m json.tool | more
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.