Pretty-Print JSON Data en un archivo usando Python

111

Un proyecto para clase implica analizar datos JSON de Twitter. Obtengo los datos y los configuro en el archivo sin muchos problemas, pero todo está en una sola 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, lo que dificulta mucho la escritura del código para la parte de manipulación de datos.

¿Alguien sabe cómo hacer eso desde Python (es decir, sin usar la herramienta de línea de comandos, que no puedo hacer que funcione)? 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()

Tenga en cuenta que agradezco que la gente me indique la documentación de simplejson y demás, pero como he dicho, ya lo he examinado y sigo necesitando ayuda. Una respuesta verdaderamente útil será más detallada y explicativa que los ejemplos que se encuentran allí. Gracias

Además: intentando esto en la línea de comandos de Windows:

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

resulta en esto:

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

Le daría los datos que estoy usando, pero es muy grande y ya ha visto el código que usé para hacer el archivo.

Zelbinian
fuente
1
Dudo que realmente desee escribir datos binarios ("wb")
Hamish
Me enseñaron que esto era necesario para las máquinas con Windows y hasta ahora ha funcionado para todas mis asignaciones. Si puede ofrecer documentación sobre por qué esto podría ser incorrecto, me complacerá verla.
Zelbinian
Solo es necesario si está trabajando con archivos binarios u otros casos en los que la forma específica del final de línea (por ejemplo, \r\nvs \n) es importante. Consulte stackoverflow.com/questions/3257869/… . En su caso, desea finales de línea compatibles con Windows, pero es posible que no obtenga eso desde el punto final de Twitter, por lo que debe abrir en modo texto.
Hamish
¿Responde esto a tu pregunta? ¿Cómo imprimir un archivo JSON?
wesinat0r

Respuestas:

102

Debes usar el argumento opcional 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()
Mattbornski
fuente
1
Gracias, funcionó a la perfección . ¿Puedes explicar por qué "sort_keys" debe estar ahí?
Zelbinian
1
No necesita estar ahí, pero hace que las cosas sean muy bonitas y estén ordenadas alfabéticamente. Tiendo a usarlo cuando quiero una salida legible por humanos.
mattbornski
4
Bien explicado, gracias. Sin embargo, no es recomendable no intentar ser un & $ & # pero abrir / cerrar para escribir un archivo, la estructura con es generalmente preferible: la with open("name_of_file.json", "w") as f: f.write(my_formatted_json_var) ventaja es que está seguro de que el archivo se cerrará, por ejemplo, en fragmentos más grandes ...
logicOnAbstractions
withsintaxis es sin duda mejor, pero trato de escalar mis respuestas a mi público
mattbornski
73

Puede analizar el JSON y luego generarlo nuevamente con sangrías como esta:

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

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

dkamins
fuente
@Zelbinian: sí, también funciona para simplejson. Echa un vistazo aquí simplejson.googlecode.com/svn/tags/simplejson-1.9.1/docs/…
RanRag
Esto da como resultado un archivo vacío. 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.dumpsdevuelve una cadena. json.dumpescribe en un archivo.
dkamins
65
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 tarde, simplemente use json.dump(). También es más rápido.

Andras Dosztal
fuente
14

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
}

Entonces, en tu caso

>>> print json.dumps(json_output, indent=4)
RanRag
fuente
Probé esa ruta y desafortunadamente no funciona tan bien como crees.
Zelbinian
@Zelbinian: Exactky, ¿qué quieres decir con doesn't work as well.?
RanRag
1
Dio salida a los datos en una sola línea en lo que parecía ser una sintaxis de dictado de Python en lugar de una sintaxis Json bastante impresa
Zelbinian
Incluya la salida en su pregunta como una edición para que podamos verla.
RanRag
Al usar esto, las matrices se enumeran como tantas líneas de cada valor, sería bueno mantener la matriz en una línea.
escape el
4

Si ya tiene archivos JSON existentes que desea un formato bonito, puede usar esto:

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

Si está generando un nuevo * .json o modificando un archivo josn existente, use el parámetro "sangría" para el formato json de vista bonita.

import json
responseData = json.loads(output)
with open('twitterData.json','w') as twitterDataFile:    
    json.dump(responseData, twitterDataFile, indent=4)
Praveen SN
fuente
1
import json
def writeToFile(logData, fileName, openOption="w"):
  file = open(fileName, openOption)
  file.write(json.dumps(json.loads(logData), indent=4)) 
  file.close()  
Pedro
fuente
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre por qué y / o cómo este código responde a la pregunta mejora su valor a largo plazo.
Tân
-2

Puede redirigir un archivo a Python y abrirlo con la herramienta y, para leerlo, use más.

El código de muestra será,

cat filename.json | python -m json.tool | more
Ramya
fuente