IOKELU
Nivel: Intermedio – Proyecto 1
💡 Ejecuta el proyecto:
Copia el código en un archivo gestor_tareas.py y ejecútalo con: python gestor_tareas.py

Proyecto 1: Gestor de tareas en consola con archivos y funciones

En este proyecto vas a crear un pequeño gestor de tareas en consola que: guarda tareas en un archivo, permite añadir, listar y marcar tareas como completadas. Usarás funciones, manejo de archivos, listas, diccionarios y buenas prácticas.

Objetivos del proyecto

  • Practicar lectura y escritura de archivos.
  • Organizar el código en funciones.
  • Trabajar con listas y diccionarios.
  • Aplicar buenas prácticas de nombres y estructura.

1. Estructura del proyecto

proyecto_tareas/
    gestor_tareas.py
    tareas.txt

2. Código completo del gestor de tareas

import os

RUTA_ARCHIVO = "tareas.txt"


def cargar_tareas():
    """Lee las tareas desde el archivo y devuelve una lista de diccionarios."""
    tareas = []
    if not os.path.exists(RUTA_ARCHIVO):
        return tareas

    with open(RUTA_ARCHIVO, "r", encoding="utf-8") as archivo:
        for linea in archivo:
            linea = linea.strip()
            if not linea:
                continue
            partes = linea.split("|")
            if len(partes) != 3:
                continue
            id_tarea, titulo, completada = partes
            tareas.append({
                "id": int(id_tarea),
                "titulo": titulo,
                "completada": completada == "1",
            })
    return tareas


def guardar_tareas(tareas):
    """Guarda la lista de tareas en el archivo."""
    with open(RUTA_ARCHIVO, "w", encoding="utf-8") as archivo:
        for tarea in tareas:
            linea = f'{tarea["id"]}|{tarea["titulo"]}|{"1" if tarea["completada"] else "0"}\n'
            archivo.write(linea)


def mostrar_tareas(tareas):
    """Muestra las tareas en consola."""
    if not tareas:
        print("No hay tareas.")
        return

    print("\nListado de tareas:")
    for tarea in tareas:
        estado = "✅" if tarea["completada"] else "❌"
        print(f'[{tarea["id"]}] {estado} {tarea["titulo"]}')
    print()


def obtener_nuevo_id(tareas):
    """Devuelve un nuevo ID incremental."""
    if not tareas:
        return 1
    return max(t["id"] for t in tareas) + 1


def agregar_tarea(tareas):
    """Pide un título y agrega una nueva tarea."""
    titulo = input("Título de la nueva tarea: ").strip()
    if not titulo:
        print("El título no puede estar vacío.")
        return

    nueva_tarea = {
        "id": obtener_nuevo_id(tareas),
        "titulo": titulo,
        "completada": False,
    }
    tareas.append(nueva_tarea)
    guardar_tareas(tareas)
    print("Tarea añadida correctamente.\n")


def marcar_completada(tareas):
    """Marca una tarea como completada por ID."""
    if not tareas:
        print("No hay tareas para marcar.")
        return

    try:
        id_str = input("ID de la tarea a marcar como completada: ")
        id_tarea = int(id_str)
    except ValueError:
        print("ID inválido.")
        return

    for tarea in tareas:
        if tarea["id"] == id_tarea:
            tarea["completada"] = True
            guardar_tareas(tareas)
            print("Tarea marcada como completada.\n")
            return

    print("No se encontró una tarea con ese ID.\n")


def mostrar_menu():
    """Muestra el menú principal."""
    print("=== Gestor de tareas ===")
    print("1. Listar tareas")
    print("2. Añadir tarea")
    print("3. Marcar tarea como completada")
    print("4. Salir")


def main():
    tareas = cargar_tareas()

    while True:
        mostrar_menu()
        opcion = input("Elige una opción: ").strip()

        if opcion == "1":
            mostrar_tareas(tareas)
        elif opcion == "2":
            agregar_tarea(tareas)
        elif opcion == "3":
            marcar_completada(tareas)
        elif opcion == "4":
            print("Saliendo del gestor de tareas...")
            break
        else:
            print("Opción no válida.\n")


if __name__ == "__main__":
    main()

3. Mejoras opcionales

4. Ejercicios sobre el proyecto


Siguiente proyecto

Proyecto 2: Aplicación de notas →