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.dumpescribe en un archivo u objeto similar a un archivo, mientras quejson.dumpsdevuelve una cadena.json.dumpescribe en un archivo de texto, no en un archivo binario. Obtendría unTypeErrorsi el archivo se abrió conwb. En versiones anteriores de Python, ambos funcionanwywbfuncionan. No es necesaria una codificación explícita ya que la salida dejson.dumpes 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 paraopensigue 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.getwriterllamada es redundante en Python 3 pero se requiere para Python 2Legibilidad y tamaño:
El uso de
ensure_ascii=Falseda 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 dedumpodumps. 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
unicodees superfluo: el resultado dejson.dumpsya 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'>.utf8incluso 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_keyscomoTrueyindentcon 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 shebangUnicodeEncodeErrorcon 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
mpupara encontrar uno súper simple y fácil de recordar:Archivo JSON creado
Finales de archivo comunes
.jsonAlternativas
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_asciibandera esTruepor defecto. Tendrá"\u20ac"secuencias de 6 bytes ilegibles para cada una€en su archivo json (así como de cualquier otro carácter no ASCII).openpara leer peroio.openpara escribir? ¿Es posible usarlo tambiénio.openpara 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
openy la assotiatedio.openmáscodecs.open, en este caso también es un truco compatible hacia atrás agradables. En python2codecs.openes más "omnívoro" que io.open (puede "comer" tanto str como unicode, convirtiendo si es necesario). Se puede decir que estecodecs.opencapricho compensa eljson.dumpscapricho 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, sidatacontiene caracteres no ASCII. (Python 2.7.6, Debian):Sin embargo, funciona bien en Python 3.
fuente
data = {'asdf': 1}. Obtendrá la notoriaTypeErrorcon 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 deiopaquete 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 simplejsonbiblioteca 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-Zluegokill %1en Linux,Ctrl-Breaken Windows).1.txttendrá 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.withEl 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