Cómo agregar datos a un archivo JSON en Python [+Vídeo]

Switch to English Version

Planteamiento del problema

Dado un objeto JSON almacenado en un archivo llamado "your_file.json", como una lista de diccionarios. ¿Cómo se pueden anexar datos, como un nuevo diccionario?

# File "your_file.json" (BEFORE)
[{"alice": 24, "bob": 27}]

# New entry:
{"carl": 33}

# File "your_file.json" (AFTER)
[{"alice": 24, "bob": 27}, {"carl": 33}]

Método 1: uso de json.load(file) y json.dump(data, file)

Para actualizar un objeto JSON en un archivo, importa la biblioteca json, lee el archivo con json.load(file), añade la nueva entrada a la lista o al diccionario de la estructura de datos data, y escribe el objeto JSON actualizado con json.dump(data, file).

En concreto, aquí están los cuatro pasos específicos para actualizar un archivo JSON existente con una nueva entrada:

  1. Importar la biblioteca json con import json
  2. Lee el archivo JSON en una estructura de datos utilizando data = json.load(file) tras abrir el archivo con open(filename, "r") en modo de lectura "r". Llegados a este punto, tienes los datos JSON en tu código Python como un diccionario o una lista (según el aspecto de tus datos – echa un vistazo a la tabla de conversión más abajo).
  3. Actualiza la estructura de datos de Python con la nueva entrada (por ejemplo, un nuevo diccionario para anexar a la lista).
  4. Escribe el JSON data actualizado de vuelta al archivo JSON utilizando json.dump(data, file) después de abrir el archivo en modo de escritura utilizando open(filename, "w").
import json

filename = 'your_file.json'
entry = {'carl': 33}

# 1. Read file contents
with open(filename, "r") as file:
    data = json.load(file)

# 2. Update json object
data.append(entry)

# 3. Write json file
with open(filename, "w") as file:
    json.dump(data, file)

De hecho, al utilizar el método json.load(), el objeto Python devuelto se convierte del formato JSON utilizando esta tabla de conversión:

JSONPython
objectdict
arraylist
stringstr
number (int)int
number (real)float
trueTrue
falseFalse
nullNone

Para conocer mejor las estructuras de datos más importantes, como el diccionario de Python, puedes consultar la Academia de Informática Finxter:

El curso es gratuito para todos los miembros premium de Finxter.

Método 2: abrir el archivo sólo una vez restableciendo el puntero del archivo

En lugar de abrir el objeto archivo dos veces, puedes abrirlo sólo una vez y restablecer el puntero del archivo mediante file.seek(0) para sobrescribir el contenido del archivo existente siguiendo estos cuatro pasos:

  1. Utiliza open("your_file.json", "r+") para crear un objeto archivo en modo de lectura y escritura "r+".
  2. Llama a json.load(file) para cargar los datos del archivo en tu código Python. Ahora puedes actualizar los datos en tu código Python. Por ejemplo, si tu archivo JSON está estructurado como una lista de diccionarios, simplemente anexa un nuevo diccionario.
  3. Utiliza file.seek(0) para restablecer el puntero del archivo a la posición 0, de modo que puedas sobrescribirlo en lugar de anexar de nuevo todo el objeto JSON.
  4. Llama a json.dump(data, file) para sobrescribir file con data.

Este es el código concreto:

import json

filename = 'your_file.json'
# Old JSON File:
# [{"alice": 24, "bob": 27}]

entry = {'carl': 33}

with open(filename, "r+") as file:
    data = json.load(file)
    data.append(entry)
    file.seek(0)
    json.dump(data, file)

# New JSON file: 
# [{"alice": 24, "bob": 27}, {"carl": 33}]

Método 3: crear un archivo JSON inicial y actualizarlo posteriormente

Si todavía no tienes un archivo JSON, puedes crear primero el archivo a partir de un listado inicial como se indica a continuación:

import json

filename = 'your_file.json'
lst = [{'alice': 24, 'bob': 27}]

# Write the initial json object (list of dicts)
with open(filename, mode='w') as f:
    json.dump(lst, f)

# Append the new dict to the list and overwrite whole file
with open(filename, mode='w') as f:
    lst.append({'carl':33})
    json.dump(lst, f)

Resumen y discusión

Los tres métodos presentados en este artículo utilizan básicamente la misma idea: llamar a json.dump(data, file) para actualizar un archivo con algunos datos. La variable data puede contener todos los distintos formatos JSON, como una lista de diccionarios o un diccionario.

Si primero necesitas cargar los datos del archivo, utiliza json.load(file) en el objeto archivo abierto en modo lectura.

En general, anexar datos a un archivo JSON no es muy buena idea porque, para cada pequeña actualización, tienes que leer y analizar todo el objeto del archivo. Si tu archivo JSON tiene n entradas, la complejidad en tiempo de ejecución de sólo actualizarlo es O(n).

Un enfoque mejor sería almacenar los datos como un archivo CSV que pudiera leerse línea por línea, lo que simplificaría el análisis y la actualización de forma significativa, ya que sólo habría que anexar una única línea al archivo con una complejidad de ejecución constante.

Gracias por estudiar este artículo, no dudes en consultar mi curso gratuito de Python para mantenerte en forma y mejorar tus conocimientos de Python continuamente, día a día. 🙂

Puedes registrarte gratis aquí: