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.


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()

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.


@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.


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)

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()

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)

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.