
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?

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)

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.

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)

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

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 str
si 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.

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