¿Qué significa “persistencia de datos”?
Persistir datos es guardar información fuera del programa para que siga disponible cuando cierres la app y la vuelvas a ejecutar. En Python, una forma directa y muy común es usar archivos: texto plano (por ejemplo .txt o .csv) o formatos estructurados como JSON. En este capítulo aprenderás a leer y escribir archivos de forma segura, y a elegir el formato adecuado según el tipo de datos.
Rutas, carpetas y modos de apertura (lo mínimo para no perderse)
Rutas relativas vs absolutas
Una ruta relativa apunta a un archivo “desde donde ejecutas” tu script (el directorio de trabajo). Una ruta absoluta incluye toda la ruta del sistema. Para proyectos, suele convenir crear una carpeta como data/ y trabajar con rutas relativas.
Modos típicos de open()
"r": lectura (falla si no existe)."w": escritura (crea o sobrescribe)."a": añadir al final (crea si no existe)."x": crear (falla si ya existe)."b": binario (por ejemplo"rb","wb").
Usa siempre with (cierre automático)
La forma recomendada de trabajar con archivos es con un bloque with, porque asegura que el archivo se cierre incluso si ocurre un error.
with open("data/notas.txt", "r", encoding="utf-8") as f: contenido = f.read()Lectura de archivos de texto
Leer todo el contenido
with open("data/notas.txt", "r", encoding="utf-8") as f: texto = f.read()print(texto)Útil para archivos pequeños. Si el archivo es grande, conviene leer por líneas.
Leer línea por línea (eficiente)
with open("data/notas.txt", "r", encoding="utf-8") as f: for linea in f: print(linea.rstrip("\n"))rstrip("\n") elimina el salto de línea final para imprimir más limpio.
Continúa en nuestra aplicación.
Podrás escuchar el audiolibro con la pantalla apagada, recibir un certificado gratuito para este curso y además tener acceso a otros 5.000 cursos online gratuitos.
O continúa leyendo más abajo...Descargar la aplicación
Leer todas las líneas en una lista
with open("data/notas.txt", "r", encoding="utf-8") as f: lineas = f.readlines()# Cada elemento suele terminar con \nEscritura de archivos de texto
Escribir (sobrescribe)
texto = "Primera línea\nSegunda línea\n"with open("data/salida.txt", "w", encoding="utf-8") as f: f.write(texto)Añadir al final (append)
nueva_linea = "Tercera línea\n"with open("data/salida.txt", "a", encoding="utf-8") as f: f.write(nueva_linea)Escribir varias líneas
lineas = ["uno\n", "dos\n", "tres\n"]with open("data/lista.txt", "w", encoding="utf-8") as f: f.writelines(lineas)writelines() no agrega saltos de línea automáticamente: debes incluirlos tú.
Mini-guía paso a paso: persistir una lista de tareas en un archivo
Objetivo: guardar tareas en un archivo para que al reiniciar el programa se vuelvan a cargar. Usaremos texto plano con una tarea por línea (simple y efectivo).
Paso 1: define la ruta del archivo
RUTA_TAREAS = "data/tareas.txt"Paso 2: función para cargar tareas (si el archivo existe)
Si el archivo no existe, devolvemos una lista vacía. Esto evita que el programa falle en el primer uso.
def cargar_tareas(ruta): try: with open(ruta, "r", encoding="utf-8") as f: return [linea.rstrip("\n") for linea in f] except FileNotFoundError: return []Paso 3: función para guardar tareas
Guardamos todas las tareas, una por línea, sobrescribiendo el archivo para reflejar el estado actual.
def guardar_tareas(ruta, tareas): with open(ruta, "w", encoding="utf-8") as f: for t in tareas: f.write(t + "\n")Paso 4: probar el flujo completo
tareas = cargar_tareas(RUTA_TAREAS)print("Tareas cargadas:", tareas)tareas.append("Estudiar 20 minutos")tareas.append("Practicar lectura/escritura de archivos")guardar_tareas(RUTA_TAREAS, tareas)print("Tareas guardadas.")Con esto, al ejecutar de nuevo, cargar_tareas recuperará lo que guardaste.
Persistencia con JSON (cuando tus datos son “estructurados”)
Texto plano sirve para listas simples, pero si necesitas guardar “registros” con varios campos (por ejemplo, nombre, prioridad, completada), JSON es más cómodo. JSON se guarda como texto, pero mantiene estructura (diccionarios y listas).
Guardar datos en JSON
import jsondatos = [ {"titulo": "Estudiar", "prioridad": 2, "hecha": False}, {"titulo": "Comprar pan", "prioridad": 1, "hecha": True},]with open("data/tareas.json", "w", encoding="utf-8") as f: json.dump(datos, f, ensure_ascii=False, indent=2)indent=2 lo deja legible. ensure_ascii=False respeta acentos y caracteres especiales.
Cargar datos desde JSON
import jsontry: with open("data/tareas.json", "r", encoding="utf-8") as f: datos = json.load(f)except FileNotFoundError: datos = []print(datos)Mini-reto: marcar una tarea como hecha y persistir
Idea: cargar la lista, cambiar un campo, guardar de nuevo.
import jsonRUTA = "data/tareas.json"def cargar(): try: with open(RUTA, "r", encoding="utf-8") as f: return json.load(f) except FileNotFoundError: return []def guardar(tareas): with open(RUTA, "w", encoding="utf-8") as f: json.dump(tareas, f, ensure_ascii=False, indent=2)tareas = cargar()if tareas: tareas[0]["hecha"] = Trueguardar(tareas)CSV (cuando piensas en “tabla”)
Si tus datos encajan en filas y columnas (por ejemplo: fecha, concepto, monto), CSV es una buena opción. Python trae el módulo csv para leer/escribir sin pelearte con comas, comillas y saltos de línea.
Escribir un CSV con encabezados
import csvfilas = [ {"fecha": "2026-01-10", "concepto": "Café", "monto": 2.5}, {"fecha": "2026-01-11", "concepto": "Libro", "monto": 15.0},]with open("data/gastos.csv", "w", encoding="utf-8", newline="") as f: writer = csv.DictWriter(f, fieldnames=["fecha", "concepto", "monto"]) writer.writeheader() writer.writerows(filas)newline="" evita líneas en blanco extra en algunos sistemas.
Leer un CSV como diccionarios
import csvwith open("data/gastos.csv", "r", encoding="utf-8", newline="") as f: reader = csv.DictReader(f) gastos = list(reader)print(gastos)Nota: al leer CSV, todo llega como texto. Si necesitas números, conviértelos (por ejemplo, float(g["monto"])).
Errores comunes y cómo evitarlos
El archivo no existe
Solución: captura FileNotFoundError y decide un valor por defecto (lista vacía, diccionario vacío, etc.).
Caracteres raros (tildes, ñ)
Solución: usa encoding="utf-8" al abrir archivos de texto.
Perder datos por sobrescritura
Si quieres conservar historial, usa "a" (append) o guarda versiones (por ejemplo, con fecha en el nombre). Si quieres reflejar “estado actual”, "w" es correcto, pero asegúrate de cargar-modificar-guardar.
Guardar estructuras complejas en texto plano
Si ya estás guardando diccionarios/listas anidadas, JSON suele ser mejor que inventar un formato propio.
Checklist práctico: elige el formato correcto
- Una línea por ítem (simple): archivo de texto.
- Datos con campos y estructura (listas/diccionarios): JSON.
- Datos tipo tabla para exportar/importar: CSV.