¿Cómo escribo datos JSON en un archivo?

Tengo datos JSON almacenados en los data variables.

Quiero escribir esto en un archivo de texto para realizar pruebas, para no tener que tomar los datos del servidor cada vez.

Actualmente, estoy probando 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?

Olvidó la parte JSON real – los data son un diccionario y aún no están codificados en JSON. Escríbelo así:

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

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

Para obtener el archivo codificado con utf8 en lugar de codificado con ascii 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 argumento encoding='utf-8' para open aún es necesario.

Para evitar el almacenamiento de una copia codificada de los datos en la memoria (resultado de dumps ) y para emitir bytestrings codificados en utf8 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) 

La llamada codecs.getwriter es redundante en Python 3 pero es necesaria 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 flags indent=4, sort_keys=True (como lo sugiere dinos66 ) a los argumentos de dump o dumps . De esta manera, obtendrá una estructura ordenada con sangría agradable en el archivo json al costo de un tamaño de archivo un poco más grande.

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

Lee y escribe archivos JSON con Python 2 + 3; trabaja 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 dictado (de lo contrario, todo estará en una línea),
  • sort_keys : ordena las claves de los diccionarios. Esto es útil si desea comparar archivos json con una herramienta de diferencias / ponerlos bajo el control de versiones.
  • separators : para evitar que Python agregue espacios en blanco al final

Con un paquete

Eche un vistazo a mi paquete de utilidades mpu para obtener uno super 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

  • CSV: formato super simple ( lectura y escritura )
  • JSON: Agradable para escribir datos legibles por humanos; Muy de uso común ( 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 Python ( lectura y escritura )
  • MessagePack ( paquete de Python ): Representación más compacta ( lectura y escritura )
  • HDF5 ( paquete de Python ): agradable para matrices ( lectura y escritura )
  • XML: existe también * suspiro * ( lectura y escritura )

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

  • Soporte por otros lenguajes de progtwigció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, puede leer mi artículo corto Archivos de configuración en Python

Para aquellos de ustedes que intentan deshacerse de idiomas griegos u otros “exóticos” como yo, pero también tienen problemas (errores de Unicode) con caracteres extraños como el símbolo de paz (\ u262E) u otros que a menudo se encuentran en datos formados por json como la de Twitter, la solución podría ser la siguiente (sort_keys obviamente es opcional):

 import codecs, json with codecs.open('data.json', 'w', 'utf8') as f: f.write(json.dumps(data, sort_keys = True, ensure_ascii=False)) 

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

Básicamente, creo que es un error en la función json.dump() en Python 2 solamente. No puede volcar datos de Python (diccionario / lista) que contengan caracteres no ASCII, incluso si abre el archivo con 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, siga la respuesta de phihag: el código en su respuesta se interrumpe en Python 2 con la excepción TypeError: must be unicode, not str , si los data contienen 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.

Escriba un dato en el archivo usando JSON use json.dump () o json.dumps () utilizado. 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 se almacena en un archivo.

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

Para escribir el JSON con sangría, “impresión bonita”:

 import json outfile = open('data.json') json.dump(data, outfile, indent=4) 

Además, si necesita depurar JSON con formato incorrecto y desea un mensaje de error útil, use la biblioteca import simplejson , en lugar de import json (las funciones deben ser las mismas)

Si está intentando escribir un dataframe de pandas en un archivo utilizando un formato json, lo recomendaría

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

Todas las respuestas anteriores son correctas aquí es un ejemplo muy simple:

 #! /usr/bin/env python import json def write_json(): # create a dictionary student_data = {"students":[]} #create a list data_holder = student_data["students"] # just a counter counter = 0 #loop through if you have multiple items.. while counter < 3: data_holder.append({'id':counter}) data_holder.append({'room':counter}) counter += 1 #write the file file_path='/tmp/student_data.json' with open(file_path, 'w') as outfile: print("writing file to: ",file_path) # HERE IS WHERE THE MAGIC HAPPENS json.dump(student_data, outfile) outfile.close() print("done") write_json() 

introduzca la descripción de la imagen aquí

Los datos JSON se pueden escribir en un archivo de la siguiente manera

 hist1 = [{'val_loss': [0.5139984398465246], 'val_acc': [0.8002029867684085], 'loss': [0.593220705309384], 'acc': [0.7687131817929321]}, {'val_loss': [0.46456472964199463], 'val_acc': [0.8173602046780344], 'loss': [0.4932038113037539], 'acc': [0.8063946213802453]}] 

Escribir en un archivo:

 with open('text1.json', 'w') as f: json.dump(hist1, f) 

La respuesta aceptada está bien. Sin embargo, me encontré con el error “no es serializable json” al usarlo.

Así es como lo arreglé con 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 genial si lo que busca es rápido y sucio.