2012-02-07 13 views
26

Un progetto per la classe prevede l'analisi dei dati Twitter JSON. Sto ottenendo i dati e impostandolo 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 è ridicolmente difficile da leggere e non riesco a esaminarlo molto bene, rendendo molto difficile la scrittura del codice per la parte di manipolazione dei dati.È necessario stampare piuttosto i dati JSON di Twitter su un file utilizzando Python

Qualcuno sa come farlo all'interno di Python (ad esempio, non utilizzando lo strumento da 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 la gente mi punta a simplejson documentazione e tali, ma come ho detto, ho già guardato questo e continuerà ad avere bisogno di assistenza. Una risposta veramente utile sarà più dettagliata e esplicativa rispetto agli esempi trovati lì. Grazie

anche: Cercando 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 utilizzando, ma è molto grande e hai già visto il codice che ho usato per creare il file.

+1

Dubito che in realtà si desidera scrivere dati binari ("wb") – Hamish

+0

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

+0

È necessario solo se si sta lavorando con file binari o altri casi in cui è importante la forma specifica di fine riga (ad esempio '\ r \ n' vs' \ n'). Vedi http://stackoverflow.com/questions/3257869/difference-between-binary-and-text-i-o-in-python-on-windows.Nel tuo caso, vuoi terminazioni di linea amichevoli per Windows, ma potresti non ottenerlo dall'endpoint di Twitter, quindi dovresti aprire in modalità testo. – Hamish

risposta

27
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() 
+0

Grazie, ha funzionato ** perfettamente **. Puoi spiegare perché "sort_keys" deve essere lì dentro? – Zelbinian

+0

Non è necessario esserci ma rende le cose molto carine e ordinate alfabeticamente. Io tendo ad usarlo quando voglio un output leggibile dall'uomo. – mattbornski

+2

Ben spiegato grazie - anche se non stai cercando di essere un & $ & # ma aprire/chiudere per scrivere un file non è incoraggiante, la struttura con è generalmente preferibile: 'con open (" nome_di_file.json "," w ") come f: f.write (my_formatted_json_var) ' Il vantaggio è che si è certi che il file si chiuderà, ad esempio in snippet più grandi ... La sintassi' '' –

24

È possibile analizzare il JSON, poi l'uscita di nuovo con trattini in questo modo:

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

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

+0

Suppongo che funzioni anche per simplejson? – Zelbinian

+0

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

+0

Il risultato è un file vuoto. 'intestazione, output = client.request (twitterRequest, method = "get", corpo = None, intestazioni = Nessuno, force_auth_header = True) twitterDataFile = open ("twitterData.json", "wb") JSON. dump (json.loads (output), twitterDataFile, indent = 4) twitterDataFile.close() ' – Zelbinian

8

È possibile utilizzare 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) 
+0

Ho provato quella via e, sfortunatamente, non funziona come penseresti. – Zelbinian

+0

@Zelbinian: Exactky cosa intendi con 'non funziona altrettanto bene? – RanRag

+1

Ha emesso i dati in un'unica riga in quella che sembrava essere la sintassi dict di Python invece della sintassi Json piuttosto stampata – Zelbinian

-1

So che questa è una vecchia questione, sono imbattuto in questa domanda e ha trovato una risposta semplice. Basta reindirizzare filename.json a python e aprirlo usando lo strumento e per leggerlo usa di più.

Il codice di esempio sarà,

cat filename.json | python -m json.tool | più

1
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 vuole analizzare la stringa in seguito, basta semplicemente utilizzare json.dump(). È anche più veloce.

Problemi correlati