navegar - youtube json python




Como faço para gravar dados JSON em um arquivo? (9)

Eu tenho dados JSON armazenados nos data variáveis.

Eu quero escrever isso para um arquivo de texto para teste, então não tenho que pegar os dados do servidor a cada vez.

Atualmente, estou tentando isso:

obj = open('data.txt', 'wb')
obj.write(data)
obj.close

E estou recebendo o erro:

TypeError: must be string or buffer, not dict

Como consertar isto?


Leia e escreva arquivos JSON com o Python 2 + 3; trabalha com unicode

# -*- coding: utf-8 -*-
import json

# Make it work for Python 2+3 and with Unicode
import io
try:
    to_unicode = unicode
except NameError:
    to_unicode = str

# Define data
data = {'a list': [1, 42, 3.141, 1337, 'help', u'€'],
        'a string': 'bla',
        'another dict': {'foo': 'bar',
                         'key': 'value',
                         'the answer': 42}}

# Write JSON file
with io.open('data.json', 'w', encoding='utf8') as outfile:
    str_ = json.dumps(data,
                      indent=4, sort_keys=True,
                      separators=(',', ': '), ensure_ascii=False)
    outfile.write(to_unicode(str_))

# Read JSON file
with open('data.json') as data_file:
    data_loaded = json.load(data_file)

print(data == data_loaded)

Explicação dos parâmetros do json.dump :

  • indent : Use 4 espaços para recuar cada entrada, por exemplo, quando um novo dict é iniciado (caso contrário, todos estarão em uma linha),
  • sort_keys : classifica as chaves dos dicionários. Isso é útil se você quiser comparar arquivos json com uma ferramenta diff / colocá-los sob controle de versão.
  • separators : Para evitar que o Python adicione espaços em branco à direita

Com um pacote

Dê uma olhada no meu pacote de utilitário mpu para um super simples e fácil de lembrar um:

import mpu.io
data = mpu.io.read('example.json')
mpu.io.write('example.json', data)

Arquivo JSON criado

{
    "a list":[
        1,
        42,
        3.141,
        1337,
        "help",
        "€"
    ],
    "a string":"bla",
    "another dict":{
        "foo":"bar",
        "key":"value",
        "the answer":42
    }
}

Terminações de arquivos comuns

.json

Alternativas

  • CSV: formato super simples ( ler e escrever )
  • JSON: Bom para escrever dados legíveis por humanos; MUITO comumente usado ( ler e escrever )
  • YAML: YAML é um superconjunto de JSON, mas mais fácil de ler ( ler e escrever , comparação de JSON e YAML )
  • pickle: um formato de serialização do Python ( read & write )
  • MessagePack ( pacote Python ): representação mais compacta ( read & write )
  • HDF5 ( pacote Python ): bom para matrizes ( ler e escrever )
  • XML: existe também * suspiro * ( read e write )

Para sua aplicação, o seguinte pode ser importante:

  • Suporte por outras linguagens de programação
  • Desempenho de leitura / escrita
  • Compacidade (tamanho do arquivo)

Veja também: Comparação de formatos de serialização de dados

Caso você esteja procurando uma maneira de criar arquivos de configuração, talvez queira ler meu pequeno artigo Arquivos de configuração em Python


A resposta aceita está bem. No entanto, eu corri para "não é serializável json" erro usando isso.

Aqui está como eu consertei com open ("file-name.json", 'w') como saída:
output.write (str (resposta))

Embora não seja uma boa solução, o arquivo json criado não terá aspas duplas, mas é ótimo se você estiver procurando por algo rápido e sujo.


Eu não tenho reputação suficiente para adicionar comentários, então eu acabei de escrever algumas das minhas descobertas deste irritante TypeError aqui:

Basicamente, eu acho que é um bug na função json.dump() somente no Python 2 - Ele não pode copiar dados do Python (dicionário / lista) contendo caracteres não-ASCII, até você abrir o arquivo com o encoding = 'utf-8' Parâmetro encoding = 'utf-8' . (Não importa o que você faça). Mas o json.dumps() funciona no Python 2 e 3.

Para ilustrar isso, siga a resposta de phihag: o código em sua resposta quebra no Python 2 com exceção TypeError: must be unicode, not str , se os data contiverem caracteres não-ASCII. (Python 2.7.6, Debian):

import json
data = {u'\u0430\u0431\u0432\u0433\u0434': 1} #{u'абвгд': 1}
with open('data.txt', 'w') as outfile:
    json.dump(data, outfile)

No entanto, funciona bem no Python 3.


Eu responderia com ligeira modificação com as respostas acima mencionadas e que é escrever um arquivo JSON prettificado que os olhos humanos possam ler melhor. Para isso, passe sort_keys como True e sort_keys com 4 caracteres de espaço e você está sort_keys para ir. Também cuide para garantir que os códigos ascii não sejam gravados no seu arquivo JSON:

with open('data.txt', 'w') as outfile:
     json.dump(jsonData, outfile, sort_keys = True, indent = 4,
               ensure_ascii = False)

Para aqueles de vocês que estão tentando despejar grego ou outras línguas "exóticas" como eu, mas também estão tendo problemas (erros unicode) com caracteres estranhos, como o símbolo de paz (\ u262E) ou outros que estão freqüentemente contidos em dados formatados json como o Twitter, a solução poderia ser a seguinte (sort_keys é obviamente opcional):

import codecs, json
with codecs.open('data.json', 'w', 'utf8') as f:
     f.write(json.dumps(data, sort_keys = True, ensure_ascii=False))

Para escrever o JSON com recuo, "pretty print":

import json

outfile = open('data.json')
json.dump(data, outfile, indent=4)

Além disso, se precisar depurar JSON formatado incorretamente e desejar uma mensagem de erro útil, use a biblioteca import simplejson , em vez de import json (as funções devem ser as mesmas)


Todas as respostas anteriores estão corretas aqui é um exemplo muito simples:

#! /usr/bin/env python
import json

def write_json():
    # create a dictionary  
    student_data = {"students":[]}
    #create a list
    data_holder = student_data["students"]
    # just a counter
    counter = 0
    #loop through if you have multiple items..         
    while counter < 3:
        data_holder.append({'id':counter})
        data_holder.append({'room':counter})
        counter += 1    
    #write the file        
    file_path='/tmp/student_data.json'
    with open(file_path, 'w') as outfile:
        print("writing file to: ",file_path)
        # HERE IS WHERE THE MAGIC HAPPENS 
        json.dump(student_data, outfile)
    outfile.close()     
    print("done")

write_json()


Você esqueceu a parte JSON real - os data são um dicionário e ainda não estão codificados em JSON. Escreva assim:

import json
with open('data.json', 'w') as outfile:
    json.dump(data, outfile)

Nota: Funciona em 3.xe 2.x.


json.dump(data, open('data.txt', 'wb'))




json