Portada de libro electrónico gratuitaPython desde cero con mini-retos: aprende programando (sin teoría eterna)

Python desde cero con mini-retos: aprende programando (sin teoría eterna)

Nuevo curso

12 páginas

Lectura y escritura de archivos para persistencia de datos

Capítulo 11

Tiempo estimado de lectura: 6 minutos

+ Ejercicio

¿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...
Download App

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 \n

Escritura 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.

Ahora responde el ejercicio sobre el contenido:

Quieres guardar una lista de tareas donde cada tarea tiene varios campos (por ejemplo titulo, prioridad y hecha) para recuperarla al reiniciar el programa. ¿Que formato conviene usar?

¡Tienes razón! Felicitaciones, ahora pasa a la página siguiente.

¡Tú error! Inténtalo de nuevo.

Para datos estructurados con varios campos por registro, JSON es mas comodo porque guarda y recupera listas y diccionarios sin inventar un formato propio.

Siguiente capítulo

Ejercicios guiados y soluciones comentadas para consolidación

Arrow Right Icon
Descarga la aplicación para obtener una certificación gratuita y escuchar cursos en segundo plano, incluso con la pantalla apagada.