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 string o buffer, no dict
¿Cómo arreglar esto?
json.dump
escribe en un archivo u objeto similar a un archivo, mientras quejson.dumps
devuelve una cadena.json.dump
escribe en un archivo de texto, no en un archivo binario. Obtendría unTypeError
si el archivo se abrió conwb
. En versiones anteriores de Python, ambos funcionanw
ywb
funcionan. No es necesaria una codificación explícita ya que la salida dejson.dump
es solo ASCII por defecto. 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 configurarloensure_ascii=False
.Para obtener utf8 -encoded file en lugar de ascii -encoded en la respuesta aceptada para Python 2 use:
El código es más simple en Python 3:
En Windows, el
encoding='utf-8'
argumento paraopen
sigue siendo necesario.Para evitar almacenar una copia codificada de los datos en la memoria (resultado de
dumps
) y generar cadenas de bytes codificadas por utf8 en Python 2 y 3, use:La
codecs.getwriter
llamada es redundante en Python 3 pero se requiere para Python 2Legibilidad y tamaño:
El uso de
ensure_ascii=False
da una mejor legibilidad y un tamaño más pequeño:Mejore aún más la legibilidad agregando banderas
indent=4, sort_keys=True
(como lo sugiere dinos66 ) a los argumentos dedump
odumps
. De esta forma, obtendrá una estructura ordenada muy bien sangrada en el archivo json a costa de un tamaño de archivo ligeramente mayor.fuente
unicode
es superfluo: el resultado dejson.dumps
ya es un objeto unicode. Tenga en cuenta que esto falla en 3.x, donde todo este desorden del modo de archivo de salida se ha limpiado, y json siempre usa cadenas de caracteres (y E / S de caracteres) y nunca bytes.type(json.dumps('a'))
es<type 'str'>
. Incluso lotype(json.dumps('a', encoding='utf8'))
es<type 'str'>
.utf8
incluso en 3.x. Se actualizó la respuesta.'ascii' codec can't decode byte 0xf1 in position 506755: ordinal not in range(128)
. Entonces, cuando tenga dudas, use la respuesta 3.xYo respondería con una ligera modificación con las respuestas antes mencionadas y eso es escribir un archivo JSON prettificado que los ojos humanos puedan leer mejor. Para esto, pasa
sort_keys
comoTrue
yindent
con 4 caracteres espaciales y listo. También asegúrese de que los códigos ASCII no se escriban en su archivo JSON:fuente
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc'
# -*- coding: utf-8 -*-
después del shebangUnicodeEncodeError
con datos no ASCII). Vea mi solución para más detalles.Leer y escribir archivos JSON con Python 2 + 3; trabaja con unicode
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, todos estarán en una línea),sort_keys
: ordena las claves de los diccionarios. Esto es útil si desea comparar archivos json con una herramienta diff / ponerlos bajo control de versiones.separators
: Para evitar que Python agregue espacios en blanco al finalCon un paquete
Eche un vistazo a mi paquete de utilidades
mpu
para encontrar uno súper simple y fácil de recordar:Archivo JSON creado
Finales de archivo comunes
.json
Alternativas
Para su aplicación, lo siguiente puede ser importante:
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, puede leer mi breve artículo Archivos de configuración en Python
fuente
force_ascii
bandera esTrue
por defecto. Tendrá"\u20ac"
secuencias de 6 bytes ilegibles para cada una€
en su archivo json (así como de cualquier otro carácter no ASCII).open
para leer peroio.open
para escribir? ¿Es posible usarlo tambiénio.open
para leer? Si es así, ¿qué parámetros se deben pasar?Para aquellos de ustedes que están tratando de deshacerse del griego u otros lenguajes "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 formateados json como Twitter, la solución podría ser la siguiente (sort_keys es obviamente opcional):
fuente
open
y la assotiatedio.open
máscodecs.open
, en este caso también es un truco compatible hacia atrás agradables. En python2codecs.open
es más "omnívoro" que io.open (puede "comer" tanto str como unicode, convirtiendo si es necesario). Se puede decir que estecodecs.open
capricho compensa eljson.dumps
capricho de generar diferentes tipos de objetos (str
/unicode
) dependiendo de la presencia de las cadenas unicode en la entrada.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 la
json.dump()
función solo en Python 2 : no puede volcar datos de Python (diccionario / lista) que contienen caracteres no ASCII, incluso si abre el archivo con elencoding = '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
, sidata
contiene caracteres no ASCII. (Python 2.7.6, Debian):Sin embargo, funciona bien en Python 3.
fuente
data = {'asdf': 1}
. Obtendrá la notoriaTypeError
con su (segunda) variante.ensure_ascii
- es necesario si desea obtener una salida utf8 "real". Sin ella, tendrá un ascii simple con 6 bytes por letra rusa en lugar de 2 bytes por carácter con esta bandera.unicode()
papel. Me acabo de dar cuenta deio
paquete en Python 2,write()
las necesidadesunicode
, nostr
.Escriba un dato en el archivo usando JSON use json.dump () o json.dumps () usado. escribir así para almacenar datos en el archivo.
Este ejemplo en la lista se almacena en un archivo.
fuente
Para escribir el JSON con sangría, "impresión bonita":
Además, si necesita depurar JSON con formato incorrecto y desea un mensaje de error útil, use la
import simplejson
biblioteca en lugar deimport json
(las funciones deben ser las mismas)fuente
fuente
f = open('1.txt', 'w'); f.write('a'); input()
. Ejecútelo y luego SYGTERM (Ctrl-Z
luegokill %1
en Linux,Ctrl-Break
en Windows).1.txt
tendrá 0 bytes. Esto se debe a que la escritura se almacenó en el búfer y no se cerró el archivo ni se cerró en el momento en que se produjo SYGTERM.with
El bloque garantiza que el archivo siempre se cierre al igual que el bloque 'probar / finalmente', pero más corto.Escribir JSON en un archivo
Leer JSON desde un archivo
fuente
si está intentando escribir un marco de datos de pandas en un archivo usando un formato json, recomendaría esto
fuente
Todas las respuestas anteriores son correctas. Aquí hay un ejemplo muy simple:
fuente
La respuesta aceptada está bien. Sin embargo, me encontré con el error "no es serializable json" al usar eso.
Así es como lo arreglé
open("file-name.json", 'w')
como salida:output.write(str(response))
Aunque no es una buena solución, ya que el archivo json que crea no tendrá comillas dobles, sin embargo, es excelente si está buscando algo rápido y sucio.
fuente
Los datos JSON se pueden escribir en un archivo de la siguiente manera
Escribe en un archivo:
fuente