Leer y escribir JSON en un archivo en Python

En este tutorial, aprenderá cómo analizar, leer y escribir JSON en archivos en Python a través de ejemplos, usando métodos de carga y volcado. También cubriremos la impresión y clasificación bonitas.

Introducción

En esta guía, veremos cómo leer y escribir datos JSON desde y hacia un archivo en Python, utilizando el módulo json.

JSON (Notación de objetos de JavaScript) es un formato extremadamente popular para la serialización de datos, dada su aplicación general y su ligereza, además de ser bastante amigable para los humanos. . En particular, se usa ampliamente en el mundo del desarrollo web, donde probablemente encontrará objetos serializados en JSON que se envían desde API REST, configuración de aplicaciones o incluso almacenamiento de datos simples.

If you'd like to read more about creating REST APIs with Python, read our Creando una API REST en Python con Django and Crear una API REST con Django REST Framework!

Dada su prevalencia, leer y analizar archivos JSON (o cadenas) es bastante común, y escribir JSON para enviarlos es igualmente común. En esta guía, veremos cómo aprovechar el módulo json para leer y escribir JSON en Python.

Escribir JSON en un archivo con Python {#escribir json en un archivo con Python}

El formato natural de JSON es similar a un mapa en informática: un mapa de pares clave-valor. En Python, un diccionario es una implementación de mapa, por lo que naturalmente podremos representar JSON fielmente a través de un dict.

Un diccionario puede contener otros diccionarios anidados, matrices, booleanos u otros tipos primitivos como enteros y cadenas.

El paquete json incorporado ofrece varios métodos convenientes que nos permiten convertir entre JSON y diccionarios.

Dicho esto, importemos el módulo json, definamos un diccionario con algunos datos y luego convirtámoslo en JSON antes de guardarlo en un archivo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import json

data = {
    'employees' : [
        {
            'name' : 'John Doe',
            'department' : 'Marketing',
            'place' : 'Remote'
        },
        {
            'name' : 'Jane Doe',
            'department' : 'Software Engineering',
            'place' : 'Remote'
        },
        {
            'name' : 'Don Joe',
            'department' : 'Software Engineering',
            'place' : 'Office'
        }
    ]
}


json_string = json.dumps(data)
print(json_string)

Esto resulta en:

1
{'employees': [{'name': 'John Doe', 'department': 'Marketing', 'place': 'Remote'}, {'name': 'Jane Doe', 'department': 'Software Engineering', 'place': 'Remote'}, {'name': 'Don Joe', 'department': 'Software Engineering', 'place': 'Office'}]}

Aquí tenemos un diccionario simple con algunos empleados, cada uno de los cuales tiene un nombre, departamento y lugar. La función dumps() del módulo json vuelca un diccionario en contenidos JSON y devuelve una cadena JSON.

Una vez serializado, puede decidir enviarlo a otro servicio que lo deserializará o, por ejemplo, lo almacenará. Para almacenar esta cadena JSON en un archivo, simplemente abriremos un archivo en modo de escritura y lo anotaremos. Si no desea extraer los datos en una variable independiente para su uso posterior y simplemente desea volcarlos en un archivo, puede omitir la función dumps() y usar dump() en este momento:

1
2
3
4
5
6
7
# Directly from dictionary
with open('json_data.json', 'w') as outfile:
    json.dump(json_string, outfile)
  
# Using a JSON string
with open('json_data.json', 'w') as outfile:
    outfile.write(json_string)

Cualquier objeto similar a un archivo se puede pasar al segundo argumento de la función dump(), incluso si no es un archivo real. Un buen ejemplo de esto sería un socket, que se puede abrir, cerrar y escribir como un archivo.

Leer JSON desde un archivo con Python

La asignación entre los contenidos del diccionario y una cadena JSON es sencilla, por lo que es fácil convertir entre los dos. Al igual que json.dumps(), la función json.loads() acepta una cadena JSON y la convierte en un diccionario.

Además, json.load() te permite cargar un archivo.

1
2
3
4
5
import json

with open('json_data.json') as json_file:
    data = json.load(json_file)
    print(data)

Esto resulta en:

1
{'employees': [{'name': 'John Doe', 'department': 'Marketing', 'place': 'Remote'}, {'name': 'Jane Doe', 'department': 'Software Engineering', 'place': 'Remote'}, {'name': 'Don Joe', 'department': 'Software Engineering', 'place': 'Office'}]}

Alternativamente, leamos una cadena JSON en un diccionario:

1
2
3
4
import json

python_dictionary = json.loads(json_string)
print(python_dictionary)

Lo que también resulta en:

1
{'employees': [{'name': 'John Doe', 'department': 'Marketing', 'place': 'Remote'}, {'name': 'Jane Doe', 'department': 'Software Engineering', 'place': 'Remote'}, {'name': 'Don Joe', 'department': 'Software Engineering', 'place': 'Office'}]}

Este es especialmente útil para analizar las respuestas de la API REST que envían JSON. Estos datos le llegan como una cadena, que luego puede pasar a json.loads() directamente, ¡y tiene un diccionario mucho más manejable para trabajar!

Opciones

Al serializar sus datos a JSON con Python, el resultado estará en el formato estándar y no muy legible ya que se eliminan los espacios en blanco. Si bien este es el comportamiento ideal para la transferencia de datos (a las computadoras no les importa la legibilidad, pero sí el tamaño), a veces es posible que deba realizar pequeños cambios, como agregar espacios en blanco para que sea legible por humanos.

json.dump()/json.dumps() y json.load()/json.loads() ofrecen algunas opciones de formato.

Pretty-Printing JSON

Hacer que JSON sea legible por humanos (también conocido como "impresión bonita") es tan fácil como pasar un valor entero para el parámetro sangría:

1
2
3
import json
data = {'people':[{'name': 'Scott', 'website': 'wikihtp.com', 'from': 'Nebraska'}]}
print(json.dumps(data, indent=4))

Esto crea una salida mucho más legible con 4 espacios en cada sangría:

1
2
3
4
5
6
7
8
9
{
    "people": [
        {
            "website": "wikihtp.com", 
            "from": "Nebraska", 
            "name": "Scott"
        }
    ]
}

Otra opción es utilizar la herramienta de línea de comandos - json.tool. Entonces, si solo desea imprimir JSON en la línea de comando, puede hacer algo como esto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ echo '{"people":[{"name":"Scott", "website":"wikihtp.com", "from":"Nebraska"}]}' | python -m json.tool
{
    "people": [
        {
            "name": "Scott",
            "website": "wikihtp.com"
            "from": "Nebraska",
        }
    ]
}
Clasificación

Un objeto JSON es:

"Un objeto es un conjunto desordenado de pares nombre/valor."

El orden de las claves no está garantizado, pero es posible que deba aplicar el orden de las claves. Para lograr el orden, puede pasar True a la opción sort_keys al usar json.dump() o json.dumps():

1
2
3
import json
data = {'people':[{'name': 'Scott', 'website': 'wikihtp.com', 'from': 'Nebraska'}]}
print(json.dumps(data, sort_keys=True, indent=4))

Esto resulta en:

1
2
3
4
5
6
7
8
9
{
    "people": [
        {
            "from": "Nebraska",
            "name": "Scott",
            "website": "wikihtp.com"
        }
    ]
}
Texto ASCII

Por defecto, json.dump() y json.dumps() asegurarán que el texto en el diccionario de Python dado esté codificado en ASCII. Si hay caracteres que no son ASCII, se escapan automáticamente, como se muestra en el siguiente ejemplo:

1
2
3
4
import json
data = {'item': 'Beer', 'cost':'£4.00'}
jstr = json.dumps(data, indent=4)
print(jstr)
1
2
3
4
{
    "item": "Beer",
    "cost": "\u00a34.00"
}

Esto no siempre es aceptable y, en muchos casos, es posible que desee mantener intactos los caracteres Unicode. Para hacer esto, establezca la opción ensure_ascii en False:

1
2
jstr = json.dumps(data, ensure_ascii=False, indent=4)
print(jstr)
1
2
3
4
{
    "item": "Beer",
    "cost": "£4.00"
}

Conclusión

En esta guía, le presentamos los métodos json.dump(), json.dumps(), json.load() y json.loads(), que ayudan a serializar y deserializar JSON instrumentos de cuerda.

Dado que JSON es una de las formas más populares de serializar datos estructurados, es probable que tenga que interactuar con ellos con bastante frecuencia, especialmente cuando trabaja en aplicaciones web. El módulo json de Python es una gran manera de empezar, aunque probablemente encontrará que simplejson es otra gran alternativa que es mucho menos estricta en sintaxis JSON. is JSON.