2012-02-07 6 views
26

Un proyecto para clase implica analizar datos de Twitter JSON. Estoy obteniendo los datos y configurándolos en el archivo sin muchos problemas, pero todo está en una línea. Esto está bien para la manipulación de datos que estoy tratando de hacer, pero el archivo es ridículamente difícil de leer y no puedo examinarlo muy bien, haciendo que el código de escritura para la parte de manipulación de datos sea muy difícil.Necesita imprimir bastante datos JSON de Twitter en un archivo usando Python

¿Alguien sabe cómo hacerlo desde dentro de Python (es decir, sin utilizar la herramienta de línea de comandos, que no puedo poner en práctica)? Aquí está mi código hasta ahora:

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 aprecio personas me señalan a simplejson documentación y tal, pero como ya he dicho, ya he mirado y que continúan necesitando asistencia. Una respuesta verdaderamente útil será más detallada y explicativa que los ejemplos que se encuentran allí. Gracias

también: Intentar esto en la línea de comandos de Windows:

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

resultados en esta:

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

Te daría los datos que estoy usando, pero es muy grande y ya has visto el código que utilicé para crear el archivo.

+1

Dudo que realmente quiera escribir datos binarios ("wb") – Hamish

+0

Me enseñaron que esto era necesario para las máquinas con Windows y hasta ahora ha funcionado para todas mis tareas. Si puede ofrecer documentación sobre por qué esto podría ser incorrecto, me gustaría verlo. – Zelbinian

+0

Solo es necesario si trabaja con archivos binarios u otros casos en los que la forma específica de finalización de línea (por ejemplo, '\ r \ n' frente a' \ n') es importante. Ver http://stackoverflow.com/questions/3257869/difference-between-binary-and-text-i-o-in-python-on-windows.En tu caso, quieres terminaciones de línea amigables para Windows, pero es posible que no lo obtengas del punto final de Twitter, por lo que debes abrir en modo texto. – Hamish

Respuesta

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

Gracias, funcionó ** perfectamente **. ¿Puedes explicar por qué "sort_keys" debe estar allí? – Zelbinian

+0

No necesita estar allí, pero hace las cosas muy bonitas y ordenadas alfabéticamente. Tiendo a usarlo cuando quiero una salida legible por humanos. – mattbornski

+2

Bien explicado gracias -sin embargo, no tratando de ser un & $ & # pero abrir/cerrar para escribir un archivo no es alentar, la estructura con generalmente es preferible: 'con abierto (" nombre_de_archivo.json "," w ") como f: f.write (my_formatted_json_var) ' La ventaja es que está seguro de que el archivo se cerrará, por ejemplo, en fragmentos más grandes ... –

24

Puede analizar el JSON, entonces la salida de nuevo con guiones como esto:

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

Ver http://docs.python.org/library/json.html para obtener más información.

+0

Supongo que esto también funciona para simplejson? – Zelbinian

+0

@Zelbinian: sí, también funciona para simplejson. Mira aquí http://simplejson.googlecode.com/svn/tags/simplejson-1.9.1/docs/index.html – RanRag

+0

Esto da como resultado un archivo vacío. 'de cabeza, salida = client.request (twitterRequest, method = "GET", cuerpo = Ninguno, cabeceras = Ninguno, force_auth_header = True) twitterDataFile = abierto ("twitterData.json", "wb") JSON. dumps (json.loads (output), twitterDataFile, indent = 4) twitterDataFile.close() ' – Zelbinian

8

Puede usar el módulo json de python para imprimir bastante.

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

Así, en su caso

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

Intenté esa ruta y desafortunadamente no funciona tan bien como podría pensar. – Zelbinian

+0

@Zelbinian: Exactky, ¿a qué te refieres con 'no funciona tan bien'.? – RanRag

+1

Emitió los datos en una sola línea en lo que parecía ser la sintaxis de dict de Python en lugar de la sintaxis de Json bastante impresa – Zelbinian

-1

Sé que esto es una cuestión de edad, encontré esta pregunta y encontré una respuesta simple. Simplemente redirecciona filename.json a python y ábrelo usando la herramienta y para leerlo usa más.

El código de ejemplo será,

filename.json gato | python -m json.tool | más

1
import json 

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

No es necesario json.dumps() si no desea analizar la cadena más adelante, simplemente utilizar json.dump(). También es más rápido.

Cuestiones relacionadas