¿Cómo escribo datos JSON en un archivo?

10 minutos de lectura

¿Como escribo datos JSON en un archivo
usuario1530318

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 este error:

TypeError: debe ser cadena o búfer, no dict

¿Cómo arreglar esto?

  • Para las banderas al abrir el archivo: Aquí, usamos la letra “w” en nuestro argumento, que indica escritura y creará un archivo si no existe en la biblioteca El signo más indica lectura y escritura, guru99.com/leer-y-escribir-archivos-en-python.html#1

    –Charlie Parker

    22 de septiembre de 2020 a las 17:14

¿Como escribo datos JSON en un archivo
phihag

Olvidaste la parte JSON real: data es un diccionario y aún no está codificado en JSON. Escribelo Me gusta esto para máxima compatibilidad (Python 2 y 3):

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

En un sistema moderno (es decir, compatible con Python 3 y UTF-8), puede escribir un archivo más agradable con

import json
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

  • esto podría ser útil para serializar: stackoverflow.com/questions/4512982/…

    – jedierikb

    11 de febrero de 2013 a las 17:27

  • ¿Te refieres a json.dump o json.dumps?

    – Terminal Diletante

    13 de agosto de 2015 a las 14:46

  • @TerminalDiletante json.dump escribe en un archivo u objeto similar a un archivo, mientras que json.dumps devuelve una cadena.

    – phihag

    13 de agosto de 2015 a las 20:58

  • por cierto: para volver a leer el uso de datos: with open(‘data.txt’) as infile: d = json.load(infile). Ver: esta respuesta

    – klaas

    7 de marzo de 2016 a las 12:59


  • @denvar No, esta respuesta está bien afinada. En Python 3, json.dump escribe en un archivo de texto, no en un archivo binario. Obtendrías un TypeError si el archivo fue abierto con wb. En versiones anteriores de Python, ambos w y wb trabajo. No es necesaria una codificación explícita ya que la salida de json.dump es solo ASCII de forma predeterminada. Si puede estar seguro de que su código nunca se ejecuta en versiones heredadas de Python y usted y el controlador del archivo JSON pueden manejar correctamente datos que no son ASCII, puede especificar uno y establecer ensure_ascii=False.

    – phihag

    19 abr 2016 a las 18:47


1646956390 252 ¿Como escribo datos JSON en un archivo
Antonio Hatchkins

Llegar utf8-archivo codificado en lugar de ascii-codificado en la respuesta aceptada para el uso de Python 2:

import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
  f.write(json.dumps(data, ensure_ascii=False))

El código es más simple en Python 3:

import json
with open('data.txt', 'w') as f:
  json.dump(data, f, ensure_ascii=False)

En Windows, el encoding='utf-8' argumento a open sigue siendo necesario.

Para evitar almacenar una copia codificada de los datos en la memoria (resultado de dumps) y a la salida codificado en utf8 cadenas de bytes en Python 2 y 3, use:

import json, codecs
with open('data.txt', 'wb') as f:
    json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)

los codecs.getwriter la llamada es redundante en Python 3 pero requerida para Python 2


Legibilidad y tamaño:

El uso de ensure_ascii=False da una mejor legibilidad y un tamaño más pequeño:

>>> json.dumps({'price': '€10'})
'{"price": "\\u20ac10"}'
>>> json.dumps({'price': '€10'}, ensure_ascii=False)
'{"price": "€10"}'

>>> len(json.dumps({'абвгд': 1}))
37
>>> len(json.dumps({'абвгд': 1}, ensure_ascii=False).encode('utf8'))
17

Mejore aún más la legibilidad agregando banderas indent=4, sort_keys=True (como lo sugiere dinos66) a argumentos de dump o dumps. De esta manera, obtendrá una estructura ordenada con una buena sangría en el archivo json a costa de un tamaño de archivo ligeramente mayor.

  • los unicode es superfluo – el resultado de json.dumps ya es un objeto Unicode. Tenga en cuenta que esto falla en 3.x, donde todo este lío del modo de archivo de salida se ha limpiado, y json siempre usa cadenas de caracteres (y E/S de caracteres) y nunca bytes.

    – phihag

    14 de febrero de 2013 a las 11:20

  • En 2.x type(json.dumps('a')) es <type 'str'>. Incluso type(json.dumps('a', encoding='utf8')) es <type 'str'>.

    –Antony Hatchkins

    14 de febrero de 2013 a las 11:25


  • Sí, en 3.x json usa cadenas, pero la codificación predeterminada es ascii. Tienes que decirle explícitamente que quieres utf8 incluso en 3.x. Actualicé la respuesta.

    –Antony Hatchkins

    14 de febrero de 2013 a las 11:39


  • La respuesta de Python 3.x funcionó para mí aunque estoy usando 2.7. La respuesta 2.x devolvió un error: 'ascii' codec can't decode byte 0xf1 in position 506755: ordinal not in range(128). Entonces, en caso de duda, ¡use la respuesta 3.x!

    – Blairg23

    22 de diciembre de 2015 a las 18:44


  • a mi codecs.getwriter era necesario en python 3. De lo contrario: json.dump( recipe , ensure_ascii=False) TypeError: dump() missing 1 required positional argument: 'fp'

    – usuario305883

    15 de febrero de 2017 a las 15:19

¿Como escribo datos JSON en un archivo
ambodi

Respondería con una ligera modificación con las respuestas antes mencionadas y eso es escribir un archivo JSON embellecido que los ojos humanos puedan leer mejor. Para esto, pase sort_keys como True y indent con 4 caracteres de espacio y listo. También 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)

  • todavía recibiendo UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc'

    – stevek-pro

    13/10/2014 a las 23:16

  • @SirBenBenji Asegúrese de que la cadena que está tratando de escribir siga: str.decode(‘utf-8’).

    – ambodi

    22 de abril de 2015 a las 9:08


  • @SirBenBenji También puede intentar usar códecs, como dinos66 especifica a continuación

    – Puñal

    03/09/2015 a las 19:01

  • También debe declarar su codificación agregando # -*- coding: utf-8 -*- después del tinglado

    – aesede

    02/04/2016 a las 17:29

  • +1 para sort_keys y sangría. @aesede No es bueno agregar esta línea porque dará la impresión de que esta solución también funciona con python2, lo cual no es así (UnicodeEncodeError con datos no ascii). Vea mi solución para más detalles.

    –Antony Hatchkins

    10 de febrero de 2017 a las 10:41

1646956392 415 ¿Como escribo datos JSON en un archivo
Martín Tomas

Leer y escribir 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, por ejemplo, cuando se inicia un nuevo dict (de lo contrario, todo estará en una línea),
  • sort_keys: ordenar las claves de los diccionarios. Esto es útil si desea comparar archivos json con una herramienta diff/ponerlos 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 utilidades mpu para uno súper 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
    }
}

Terminaciones comunes de archivos

.json

Alternativas

  • CSV: formato súper simple (lectura y escritura)
  • JSON: Agradable para escribir datos legibles por humanos; MUY comúnmente utilizado (lectura y escritura)
  • YAML: YAML es un superconjunto de JSON, pero más fácil de leer (lectura y escritura, comparación de JSON y YAML)
  • pickle: un formato de serialización de Python (lectura y escritura)
  • paquete de mensajes (Paquete Python): Representación más compacta (lectura y escritura)
  • HDF5 (Paquete Python): Agradable para matrices (lectura y escritura)
  • XML: también existe *suspiro* (lectura y escritura)

Para su aplicación, lo siguiente podría ser importante:

  • Soporte de otros lenguajes de programación
  • Rendimiento de lectura/escritura
  • Compacidad (tamaño de 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

Para aquellos de ustedes que están tratando de deshacerse del griego u otros idiomas “exóticos” como yo, pero también tienen problemas (errores Unicode) con caracteres extraños como el símbolo de la paz (\u262E) u otros que a menudo están contenidos en datos con formato json como la de 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))

  • +1 Mientras que docs recomienda python3 incorporado open y los asociados io.open sobre codecs.open, en este caso también es un buen truco compatible con versiones anteriores. en python2 codecs.open es más “omnívoro” que io.open (puede “comer” tanto str como unicode, convirtiendo si es necesario). Se puede decir que esto codecs.open peculiaridad compensa json.dumps peculiaridad de generar diferentes tipos de objetos (str/unicode) dependiendo de la presencia de las cadenas Unicode en la entrada.

    –Antony Hatchkins

    10 de febrero de 2017 a las 11:06


1646956390 252 ¿Como escribo datos JSON en un archivo
Antonio Hatchkins

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

Básicamente, creo que es un error en el json.dump() funcion 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 tanto en Python 2 como en 3.

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

  • +1 Mientras que docs recomienda python3 incorporado open y los asociados io.open sobre codecs.open, en este caso también es un buen truco compatible con versiones anteriores. en python2 codecs.open es más “omnívoro” que io.open (puede “comer” tanto str como unicode, convirtiendo si es necesario). Se puede decir que esto codecs.open peculiaridad compensa json.dumps peculiaridad de generar diferentes tipos de objetos (str/unicode) dependiendo de la presencia de las cadenas Unicode en la entrada.

    –Antony Hatchkins

    10 de febrero de 2017 a las 11:06


1646956392 892 ¿Como escribo datos JSON en un archivo
Vishal Gedya

Escriba un archivo de datos usando el uso de JSON json.dump() o json.dumps() usado. escriba 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 se almacena en un archivo.

  • es similar pero proporciona un ejemplo

    – Vishal Gedya

    17 de febrero de 2017 a las 7:30

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad