Construir una máquina de café en Python te enseña a manejar escritura y lectura de archivos con casos reales: guardar pedidos, mostrar historial y controlar errores cuando el archivo aún no existe. Aquí verás cómo cerrar el proyecto final del curso usando diccionarios, modos de apertura y manejo de excepciones.
Cómo validar la opción del usuario con un diccionario en Python
El punto de partida es un diccionario donde las keys son números (1, 2, 3, 4) y los values son los nombres de los cafés: expreso, capuchino, latte y americano. Cuando preguntas if opcion in cafes, Python revisa directamente las claves, así que no necesitas escribir cafes.keys() para que funcione.
Si la opción es válida, guardas el café en una variable llamada cafe_elegido accediendo con cafes[opcion]. Si no lo es, el else imprime un mensaje pidiendo intentar de nuevo. Este patrón evita validaciones largas con múltiples if encadenados [01:05].
¿Por qué usar un diccionario en vez de listas? Porque te permite validar la opción y obtener el nombre del café en una sola operación, sin recorrer estructuras manualmente.
Cómo escribir pedidos en un archivo .txt sin sobrescribir datos
Aquí aparece la decisión clave del proyecto: el modo de apertura del archivo. Si usas "w", cada pedido nuevo borra el anterior. La solución es usar "a" (append), que agrega contenido al final del archivo sin tocar lo que ya estaba escrito [02:45].
La estructura queda así:
- Abrir el archivo con
with open(ARCHIVO_PEDIDOS, "a", encoding="utf-8") as archivo.
- Escribir el café con
archivo.write(cafe_elegido + "\n").
- Usar
"\n" para que cada pedido quede en una línea distinta.
El encoding="utf-8" es importante porque permite guardar acentos y caracteres especiales sin que se rompan al leerlos después. Y el nombre del archivo se guarda en una constante ARCHIVO_PEDIDOS = "pedidos.txt", escrita en mayúsculas porque, por convención en Python, las constantes se nombran así [03:50].
Cómo importar la función pedir_café en el main
Desde el archivo principal, basta con from pedidos import pedir_cafe y llamarla en la opción 1 del menú. El bucle while mantiene la aplicación corriendo hasta que el usuario decide salir.
Cómo leer el historial de pedidos con readlines y manejo de errores
El segundo módulo, historial.py, debe leer el mismo archivo. Para evitar duplicar rutas, se reutiliza la constante ARCHIVO_PEDIDOS. La función ver_historial() se envuelve en un bloque try / except porque, si el usuario nunca ha pedido un café, el archivo no existe todavía [05:30].
La lógica es esta:
try: abre el archivo en modo lectura con "r" y encoding="utf-8".
archivo.readlines() devuelve todas las líneas en una lista llamada pedidos.
except FileNotFoundError: imprime que aún no existe un historial.
¿Qué hace FileNotFoundError en Python? Es la excepción que se dispara cuando intentas leer un archivo que no existe. Atraparla evita que el programa se rompa.
Cómo numerar el historial con enumerate
Para mostrar cada pedido con su número, entra en escena enumerate, una función que devuelve dos valores en cada vuelta del bucle: el índice y el contenido. Le pasas enumerate(pedidos, 1) para que la numeración arranque en 1 en lugar de 0 [07:20].
Dentro del for i, pedido in enumerate(pedidos, 1), conviertes i a string con str(i) y aplicas pedido.strip() para eliminar el salto de línea que se guardó al escribir el archivo. El método strip quita espacios y saltos al inicio y al final del texto.
Si el archivo existe pero está vacío, un else complementa al if pedidos mostrando el mensaje aún no hay ningún pedido. Así cubres los tres flujos posibles: archivo inexistente, archivo vacío y archivo con datos.
Qué aprendiste con este proyecto final de Python
La máquina de café conecta varios fundamentos en una sola aplicación funcional:
- Diccionarios para mapear opciones a valores.
- Modos de apertura
"a" y "r" con with open.
- Constantes en mayúscula como buena práctica.
- Manejo de excepciones con
try / except FileNotFoundError.
- Iteración indexada con
enumerate empezando desde 1.
- Limpieza de strings con
strip para eliminar \n.
Probar el flujo completo significa pedir varios cafés, ver cómo se acumulan en pedidos.txt, borrar líneas manualmente y comprobar que el historial se actualiza dinámicamente. La opción 3 ejecuta un break que rompe el while y cierra la aplicación con un mensaje de despedida [09:40].
Cuéntame en los comentarios qué café elegirías como primer pedido y qué proyecto te gustaría construir como siguiente paso en tu ruta de Python.