Pregunta ¿Cómo escribo datos JSON en un archivo?


Tengo datos JSON almacenados en la variable data.

Quiero escribir esto en un archivo de texto para probarlo, así no tengo que tomar los datos del servidor cada vez.

Actualmente, estoy intentando esto:

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

Y estoy recibiendo el error:

TypeError: must be string or buffer, not dict

¿Cómo arreglar esto?


680
2017-09-06 22:21


origen


Respuestas:


Olvidaste la parte JSON real - data es un diccionario y aún no está codificado en JSON. Escríbelo así:

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

Nota: Funciona tanto en 3.x como en 2.x.


1318
2017-09-06 22:23



Llegar utf8-codificado


200
2018-02-14 08:22



Yo respondería con una ligera modificación con las respuestas antes mencionadas y eso es escribir un archivo JSON embellecido para que los ojos humanos puedan leer mejor. Para esto, pase sort_keys como True y indent con 4 personajes espaciales y estás listo para ir. Además, asegúrese de que los códigos ASCII no se escriban en su archivo JSON:

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

130
2017-12-25 20:04



Lee y escribe archivos JSON con Python 2 + 3; funciona con 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)

Explicación de los parámetros de json.dump:

  • indent: Use 4 espacios para sangrar cada entrada, p. cuando se inicia un nuevo dict (de lo contrario, todo estará en una línea),
  • sort_keys: ordena las claves de los diccionarios. Esto es útil si quiere comparar archivos json con una herramienta diff / póngalos bajo control de versión.
  • separators: Para evitar que Python agregue espacios en blanco al final

Con un paquete

Echa un vistazo a mi paquete de herramientas mpu para una muy simple y fácil de recordar:

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

Archivo JSON creado

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

Finales de archivos comunes

.json

Alternativas

Para su aplicación, lo siguiente puede ser importante:

  • Soporte por otros lenguajes de programación
  • Rendimiento de lectura / escritura
  • Compacidad (tamaño del archivo)

Ver también: Comparación de formatos de serialización de datos

En caso de que esté buscando una forma de crear archivos de configuración, es posible que desee leer mi breve artículo Archivos de configuración en Python


80
2018-06-13 16:43



Para aquellos de ustedes que están tratando de abandonar el griego u otros idiomas "exóticos" como yo, pero también están teniendo problemas (errores unicode) con caracteres extraños como el símbolo de paz (\ u262E) u otros que a menudo están contenidos en datos json formateados como Twitter, la solución podría ser la siguiente (sort_keys es 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))

18
2017-07-10 14:45



No tengo suficiente reputación para agregar comentarios, así que escribo algunos de mis hallazgos sobre este molesto TypeError aquí:

Básicamente, creo que es un error en el json.dump() función en Python 2 solamente: no puede volcar datos de Python (diccionario / lista) que contengan caracteres que no sean ASCII, incluso abres el archivo con el encoding = 'utf-8' parámetro. (es decir, no importa lo que hagas). Pero, json.dumps() funciona en Python 2 y 3.

Para ilustrar esto, sigue la respuesta de phihag: el código en su respuesta se rompe en Python 2 con excepción TypeError: must be unicode, not str, Si data contiene caracteres que no son 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)

Sin embargo, funciona bien en Python 3.


10
2018-01-03 06:52



Escribir datos en un archivo usando el uso de JSON json.dump () o json.dumps () usado. escribe así para almacenar datos en el archivo.

import json
data = [1,2,3,4,5]
with open('no.txt', 'w') as txtfile:
    json.dump(data, txtfile)

este ejemplo en la lista es almacenar en un archivo.


6
2017-12-24 10:58



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

4
2018-02-29 20:16



Si está tratando de escribir un marco de datos de pandas en un archivo usando un formato json, lo recomendaría

destination='filepath'
saveFile = open(destination, 'w')
saveFile.write(df.to_json())
saveFile.close()

2
2018-06-03 07:48



Aquí hay una estructura útil para leer y escribir un archivo en Python 3.

from json import dump, load
from time import sleep
from random import random

def json_file(path, data = None, delay = 0.1):
    while True:
        try:
            if data == None:
                with open(path, "r", encoding = "utf-8") as f:
                    return load(f)
            else:
                with open(path, "w", encoding = "utf-8") as f:
                    return dump(data, f)
        except:
            sleep(random()*delay) # concurrency

0
2018-01-24 10:22