serialize importar extraer dict diccionario datos create crear convertir archivos archivo python json

python - importar - ¿Cómo escribo datos JSON en un archivo?



python json to dict (12)

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 Python ): agradable para matrices ( lectura y escritura )
  • XML: existe también * suspiro * ( read y write )

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

  • Soporte por otros lenguajes de programación.
  • Rendimiento de lectura / escritura
  • Compacidad (tamaño del archivo)

Ver también: Comparación de formatos de serialización de datos.

Si está buscando una forma de crear archivos de configuración, le recomendamos que lea mi breve artículo Archivos de configuración en Python

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?


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 es almacenar en un archivo.


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

Aunque no es una buena solución, ya que el archivo json que crea no tendrá comillas dobles, sin embargo, es ideal si lo que busca es rápido y sucio.


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)


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.


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


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.


Si está intentando escribir un marco de datos 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()


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)


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