Resumen

Aprende a manejar la escritura y lectura de archivos en Python con un proyecto práctico de máquina de café. Aquí verás cómo usar un diccionario para validar opciones, confirmar un pedido y persistirlo en un TXT con with open, modo de apertura adecuado y encoding correcto. Además, sumarás manejo de errores con try/except, lectura con readlines y numeración con enumerate.

¿Qué construimos y por qué importa?

Creamos un flujo completo para gestionar pedidos de café y su historial. La clave está en dos funciones: una para pedir y escribir en un archivo, y otra para leer y mostrar el historial. Así consolidas habilidades de E/S con archivos, control de flujo y trabajo con colecciones.

  • Diccionario de opciones: las keys representan opciones y las values nombres de cafés.
  • Validación de entrada: se verifica si la opción ingresada existe en las keys.
  • Persistencia: cada pedido se guarda en pedidos.txt usando modo de apertura adecuado.
  • Lectura segura: el historial se muestra manejando la ausencia del archivo.

¿Cómo se valida la opción y se guarda el pedido?

Se consulta la opción del usuario y se valida contra las keys del diccionario. Si es válida, se confirma el pedido y se escribe una línea en el archivo de pedidos. Se usa modo 'a' para agregar sin sobrescribir y encoding UTF-8 para caracteres con acentos.

¿Cómo usar un diccionario y validar keys?

  • Usar un diccionario con opciones y nombres de café.
  • Verificar pertenencia: if opcion in cafes.
  • Informar error cuando la opción no es válida.

¿Cómo confirmar el pedido y escribir en archivo?

  • Imprimir confirmación con concatenación y texto descriptivo.
  • Abrir con with open en modo 'a' y encoding 'utf-8'.
  • Escribir el nombre del café con salto de línea '\n'.
  • Usar una constante para el nombre del archivo: ARCHIVO_PEDIDOS.
# pedidos.py
ARCHIVO_PEDIDOS = "pedidos.txt"

def pedir_cafe():
    cafes = {"1": "expreso", "2": "capuchino", "3": "latte", "4": "americano"}
    opcion = input("Elige un café que prefieras: ")

    if opcion in cafes:  # valida contra las keys
        cafe_elegido = cafes[opcion]
        print("Has pedido un " + cafe_elegido + ". Preparando tu café")
        # escritura en modo append con UTF-8
        with open(ARCHIVO_PEDIDOS, "a", encoding="utf-8") as archivo:
            archivo.write(cafe_elegido + "\n")
    else:
        print("Opción no válida. Por favor, intenta de nuevo.")

¿Cómo leer el historial con manejo de errores en Python?

La lectura del historial requiere contemplar que el archivo no exista aún. Se utiliza try/except para capturar FileNotFoundError. Si hay contenido, se muestra numerado con enumerate(start=1) y cada línea se limpia con strip para quitar el salto de línea.

¿Cómo proteger la lectura con try y except?

  • Imprimir un encabezado de historial.
  • Abrir el archivo en modo lectura con encoding 'utf-8'.
  • Capturar FileNotFoundError y avisar que no existe historial.

¿Cómo listar líneas con enumerate y strip?

  • Usar readlines para obtener todas las líneas.
  • Verificar si la lista no está vacía.
  • Recorrer con enumerate(pedidos, start=1) para numerar.
  • Aplicar strip para remover el '\n' final.
# historial.py
ARCHIVO_PEDIDOS = "pedidos.txt"

def ver_historial():
    try:
        print("\nHistorial de pedidos")
        with open(ARCHIVO_PEDIDOS, "r", encoding="utf-8") as archivo:
            pedidos = archivo.readlines()

        if pedidos:
            for i, pedido in enumerate(pedidos, start=1):
                print(str(i) + ". " + pedido.strip())
        else:
            print("Aún no hay ningún pedido")

    except FileNotFoundError:
        print("\nTodavía no existe un historial de pedidos")

¿Cómo integrar ver historial en el main?

  • Importar funciones con from modulo import funcion.
  • Atar la opción 1 a pedir_cafe y la 2 a ver_historial.
  • Usar break en la opción 3 para salir del bucle while.
# main.py
from pedidos import pedir_cafe
from historial import ver_historial

while True:
    print("1. Pedir un café")
    print("2. Ver el historial de pedidos")
    print("3. Salir")
    opcion = input("Elige una opción: ")

    if opcion == "1":
        pedir_cafe()
    elif opcion == "2":
        ver_historial()
    elif opcion == "3":
        print("Muchas gracias por haber tomado nuestros riquísimos cafés")
        break

¿Te gustaría compartir cómo adaptarías este flujo para nuevos tipos de bebidas o formatos de historial? Deja tu comentario y cuéntanos qué parte te resultó más útil.