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
- Permitir borrar tareas por ID.
- Filtrar solo tareas completadas o pendientes.
- Ordenar tareas por título.
- Usar JSON en lugar de texto plano.
4. Ejercicios sobre el proyecto
- Añadir opción para borrar una tarea por ID.
- Añadir opción para mostrar solo tareas completadas.
- Añadir opción para mostrar solo tareas pendientes.
- Guardar las tareas en JSON en lugar de texto plano.
- Separar la lógica de archivo en otro módulo.
def borrar_tarea(tareas):
id_tarea = int(input("ID a borrar: "))
tareas[:] = [t for t in tareas if t["id"] != id_tarea]
guardar_tareas(tareas)
completadas = [t for t in tareas if t["completada"]]
pendientes = [t for t in tareas if not t["completada"]]
import json
json.dump(tareas, open("tareas.json","w"), indent=4)
# Crear archivo tareas_io.py con cargar_tareas y guardar_tareas