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:
- Importar la biblioteca
json
conimport json
- Lee el archivo JSON en una estructura de datos utilizando
data = json.load(file)
tras abrir el archivo conopen(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). - Actualiza la estructura de datos de Python con la nueva entrada (por ejemplo, un nuevo diccionario para anexar a la lista).
- 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 utilizandoopen(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:
JSON | Python |
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
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:
- Utiliza
open("your_file.json", "r+")
para crear un objeto archivo en modo de lectura y escritura"r+"
. - 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. - 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. - 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í: