importar - serialize json python




¿Cómo escribo datos JSON en un archivo? (8)

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.


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.


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.


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