Pretty-Print JSON Data to a File usando Python

111

Um projeto para a aula envolve a análise de dados JSON do Twitter. Estou obtendo os dados e configurando-os no arquivo sem muitos problemas, mas está tudo em uma linha. Isso é bom para a manipulação de dados que estou tentando fazer, mas o arquivo é ridiculamente difícil de ler e não posso examiná-lo muito bem, tornando a escrita de código para a parte de manipulação de dados muito difícil.

Alguém sabe fazer isso de dentro do Python (ou seja, não usando a ferramenta de linha de comando, que não consigo fazer funcionar)? Este é meu código até agora:

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 Agradeço as pessoas que me apontam para a documentação do simplejson e tal, mas como afirmei, já olhei para isso e continuo precisando de ajuda. Uma resposta verdadeiramente útil será mais detalhada e explicativa do que os exemplos encontrados lá. obrigado

Além disso: tente isso na linha de comando do Windows:

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

resulta neste:

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

Eu daria a você os dados que estou usando, mas são muito grandes e você já viu o código que usei para fazer o arquivo.

Zelbinian
fonte
1
Duvido que você realmente queira gravar dados binários ("wb")
Hamish
Aprendi que isso era necessário para máquinas Windows e, até agora, funcionou para todas as minhas atribuições. Se você puder oferecer uma documentação explicando por que isso pode estar incorreto, ficarei feliz em dar uma olhada.
Zelbinian
Só é necessário se você estiver trabalhando com arquivos binários ou outros casos em que a forma específica de finalização de linha (por exemplo, \r\nvs \n) é importante. Consulte stackoverflow.com/questions/3257869/… . No seu caso, você quer terminações de linha compatíveis com o Windows, mas pode não conseguir isso no terminal do Twitter, então você deve abrir em modo de texto.
Hamish
Isso responde sua pergunta? Como imprimir um arquivo JSON?
wesinat0r

Respostas:

102

Você deve usar o 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
fonte
1
Obrigado, funcionou perfeitamente . Você pode explicar por que "sort_keys" precisa estar lá?
Zelbinian
1
Não precisa estar lá, mas torna as coisas muito bonitas e organizadas em ordem alfabética. Costumo usá-lo quando quero uma saída legível por humanos.
mattbornski
4
Bem explicado, obrigado - no entanto, não tentar ser um & $ & # mas abrir / fechar para escrever um arquivo não é encorajador, a estrutura com é geralmente preferível: with open("name_of_file.json", "w") as f: f.write(my_formatted_json_var) Vantagem sendo que você tem certeza de que o arquivo irá fechar, digamos em trechos maiores ...
logicOnAbstractions
withA sintaxe é definitivamente melhor, mas tento dimensionar minhas respostas para meu público
mattbornski
73

Você pode analisar o JSON e gerá-lo novamente com recuos como este:

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

Consulte http://docs.python.org/library/json.html para obter mais informações.

dkamins
fonte
@Zelbinian: sim, também funciona para o simplejson. Dê uma olhada aqui simplejson.googlecode.com/svn/tags/simplejson-1.9.1/docs/…
RanRag
Isso resulta em um arquivo vazio. 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.dumpsretorna uma string. json.dumpgrava em um arquivo.
dkamins
64
import json

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

Você não precisa json.dumps()se não quiser analisar a string mais tarde, simplesmente use json.dump(). É mais rápido também.

Andras Dosztal
fonte
14

Você pode usar o módulo json do python para uma impressão bonita.

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

Então, no seu caso

>>> print json.dumps(json_output, indent=4)
RanRag
fonte
Tentei esse caminho e infelizmente não funciona tão bem quanto você pensa.
Zelbinian
@Zelbinian: Exato, o que você quer dizer com doesn't work as well.?
RanRag
1
Ele produziu os dados em uma única linha no que parecia ser a sintaxe Python dict em vez da sintaxe Json bem impressa
Zelbinian
Inclua a saída em sua pergunta como uma edição. Portanto, podemos ver.
RanRag
usando isso, os arrays são listados quantas linhas de cada valor, seria bom manter o array em uma linha.
escapo de
4

Se você já tem arquivos JSON existentes que deseja formatar, você pode usar isto:

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

Se você estiver gerando um novo * .json ou modificando o arquivo josn existente, use o parâmetro "indent" para o formato json do pretty view.

import json
responseData = json.loads(output)
with open('twitterData.json','w') as twitterDataFile:    
    json.dump(responseData, twitterDataFile, indent=4)
Praveen SN
fonte
1
import json
def writeToFile(logData, fileName, openOption="w"):
  file = open(fileName, openOption)
  file.write(json.dumps(json.loads(logData), indent=4)) 
  file.close()  
Peter
fonte
Embora este código possa responder à pergunta, fornecer contexto adicional sobre por que e / ou como este código responde à pergunta melhora seu valor a longo prazo.
Tân
-2

Você pode redirecionar um arquivo para python e abri-lo usando a ferramenta e para lê-lo, use mais.

O código de amostra será,

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