Ejercicios: El Archivo Central
Tus datos no duran si viven solo en memoria. Estos ejercicios te obligan a escribir, leer y gestionar archivos reales en disco. Para lograrlo de verdad, corre estos ejercicios en tu terminal: la edición web los ejecuta en la memoria temporal del navegador, no en tu disco.
Ejercicio 11.1: El Explorador de Rutas (pathlib)
- Importa
Pathdepathlib. - Crea un objeto Path que apunte a un archivo ficticio
datos/usuarios.txt. - Imprime solo el nombre del archivo (
usuarios.txt). - Imprime la carpeta padre (
datos).
Pista 1: un objeto
Pathguarda por separado cada pedazo de la ruta (carpeta, nombre de archivo); no necesitas trocear el string tú mismo con slicing.Pista 2: los atributos que buscas son
.namey.parent.
Ejercicio 11.2: La Nota de Bienvenida (Escritura simple)
- Crea un archivo llamado
bienvenida.txt. - Escribe dentro el texto: “¡Bienvenido al sistema v1.0!”.
- Lee el archivo e imprime su contenido para verificar.
Pista 1: vas a necesitar abrir el mismo archivo dos veces, con un modo distinto cada vez: una para meter el texto adentro y otra para sacarlo de vuelta.
Pista 2: escribe con
with open(archivo, "w") as f: f.write(texto); al salir del bloque, el archivo se guarda y se cierra solo. Luego ábrelo de nuevo conwith open(archivo, "r") as f:y usa.read()para traer todo el contenido de una vez.
Ejercicio 11.3: El Registro de Acceso (append)
Un log de seguridad básico: cada entrada se suma a lo que ya estaba.
- Define una lista de nombres:
["Ana", "Beto", "Carla"]. - Usa un bucle
forpara recorrer los nombres. - Abre el archivo
acceso.loguna sola vez, antes del bucle, en modo Append ("a"). - Escribe una línea: “Usuario [Nombre] entró al sistema.\n”. (No olvides el
\npara el salto de línea).
Pista 1: puedes abrir el archivo una sola vez con
with, antes delfor, y escribir las tres líneas dentro del mismo bloque. No hace falta reabrirlo en cada vuelta.Pista 2: arma cada línea con un f-string:
f"Usuario {nombre} entró al sistema.\n".
Ejercicio 11.4: Verificador de Existencia
- Define una ruta a un archivo
secreto.txt. - Comprueba: si el archivo existe, imprime su contenido; si no, crea uno nuevo con el texto ‘Top Secret’.
- Ejecuta el script dos veces para ver cómo cambia el comportamiento.
Pista 1: antes de crear el archivo, ¿cómo sabrías desde el código si ya existe?
pathlibtiene una forma directa de preguntarlo, sin intentar abrirlo primero.Pista 2: usa
Path("secreto.txt").exists()para decidir la rama; la rama “si no existe” es la que escribe el archivo por primera vez, con modo"w".
Ejercicio 11.5: Limpieza de Archivos
Borra el archivo con .unlink(), el retiro de cajas que viste en la sección de pathlib.
- Crea un archivo
basura.tmp. - Verifica que existe.
- Bórralo desde el código.
- Verifica que ya no existe imprimiendo
exists().
- Reto: la operación no tiene deshacer; confirma con
exists()antes de borrar, no solo después.
Pista 1: todo el ejercicio es demostrar, con evidencia antes y después, que un archivo desaparece de verdad del disco cuando lo borras desde código.
Pista 2:
.unlink()actúa de inmediato y sin confirmación; llamarexists()después es la única forma de comprobar que funcionó.
Ejercicio 11.6: Inventario en JSON (Round-trip)
- Crea una lista de al menos dos diccionarios (Cap. 5)
producto(connombreyprecio). Que uno tenga una coma en el nombre, como"Tornillos, 2mm". - Guárdala en
productos.jsonconjson.dump(usaindent=2). - Léela de vuelta con
json.loady comprueba dos cosas: que el nombre con coma sobrevivió intacto, y que el precio sigue siendo número (súmale 1 sin convertir nada).
Pista 1:
json.dumpno le teme a las comas dentro de una cadena: el formato JSON las protege igual que Python protege las cadenas con comillas.Pista 2: al leer con
json.load, el precio vuelve como el mismo tipo numérico que guardaste (floatoint), listo para sumar sinfloat()niint(). Verifícalo en el.json:1500.00sin comillas alrededor es un número; entre comillas, es texto y algo salió mal en el paso 2.
Ejercicio 11.7: La Caja de Herramientas (import)
- Importa
randomde la biblioteca estándar y usarandom.choice(...)para elegir un producto al azar de una lista. - Importa
datedesdedatetimey, condate.today(), imprime la fecha de hoy junto al producto elegido.
Pista 1: tanto elegir al azar como obtener la fecha de hoy son problemas tan comunes que ya vienen resueltos en la biblioteca estándar; no instalas nada, solo importas lo que ya trae Python.
Pista 2:
random.choice(lista)regresa un elemento de la lista;date.today()no recibe argumentos.
Ejercicio 11.8: El Manifiesto en CSV (Round-trip)
El módulo con nombre de formato merece su vuelta completa:
- Escribe
manifiesto.csvconcsv.DictWriter: columnasproductoycantidad, y al menos tres filas (una con coma en el nombre, tipo"Tornillos, 2mm", para comprobar que el módulo la protege). - Léelo de regreso con
csv.DictReadere imprime cada fila comoproducto x cantidad. - Suma las cantidades leídas. Recuerda: del CSV todo sale como texto; sin
int()no hay suma. - Encapsula los pasos 2 y 3 en una función
total_manifiesto() -> int(Cap. 9) que retorne la suma. - Limpia: borra el archivo al final con
.unlink().
Pista 1:
csv.DictWriterycsv.DictReaderson simétricos: escribes con columnas nombradas y lees de vuelta con esas mismas columnas como claves de cada fila.Pista 2:
DictWriternecesita los nombres de columnas por adelantado confieldnames=[...]; cada fila que entregaDictReaderes puro texto, así que conviertes conint()solo el campo que vas a sumar; y llama atotal_manifiesto()después de leer el CSV pero antes del.unlink()final, o ya no quedará nada que leer.
Cuidado: Borrar archivos no tiene deshacer. Comprueba la ruta antes de ejecutar.
Soluciones: en el Apéndice B está la solución de cada ejercicio. Inténtalo por tu cuenta antes de consultarla.
Ya sabes guardar y recuperar una lista de diccionarios sin perder un solo tipo de dato. Esa es exactamente la memoria permanente que necesita el Sistema de Gestión de Inventario del proyecto final, que arranca en el siguiente capítulo.