ESTE TO-DO LIST USA BUCLES Y LISTAS (LO VISTO EN CLASE), PERO SI QUISIERAMOS QUE ESTOS DATOS PERMANEZCAN AUN CUANDO CERRAMOS LA APLICACIÓN, LAS LISTAS SON VOLÁTILES (es decir, solo duran mientras la aplicación este en ejecución, luego se pierden) Y PARA ESO PODEMOS GUARDAR LA INFORMACIÓN DE NUESTRO TO-DO LIST EN FICHEROS (es una opción aceptable para este programa pequeño porque una base de datos sería mucho para este programa).
Estos son los archivos que tengo:
Posdata: Ese from task import Task
es la forma de usar la clase Task que esta en el archivo task.py
fromtaskimportTask
tarea = Task()
whileTrue:
print("Ingresar tarea -> 1\n"+
"Actualizar tarea -> 2\n"+
"Delete tarea -> 3\n"+
"Listar tareas -> 4\n"+
"Salir -> 5\n")
opcion = input("What do you want: ")
if opcion=='1':
tarea.inputTask()
elif opcion=='2':
tarea.update(input("Ingrese la tarea: "))
elif opcion=='3':
tarea.delete(input("Ingrese el elemento a borrar: "))
elif opcion=='4':
tarea.listar()
elif opcion=='5':
tarea.write()
print("------ ADIOS ------")
breakelse:
print("Esa opción no existe :/")
classTask:def__init__(self):
self.tareas = []
self.read()
##Read the filedefread(self):
f = open("Task.txt","r",encoding='utf-8')
try:
#split() devuelve una lista
partes = f.read().split('%')
for parte in partes:
self.tareas.append(parte.split(','))
#print(self.tareas)finally:
f.close()
# Write in the filedefwrite(self):
file = open("Task.txt","w",encoding='utf-8')
#Concatenar todos los valores de la lista en un string, # separados por una coma
concat =""
ultimo = len(self.tareas)
for tarea in self.tareas:
if ultimo==1:
concat = concat + ','.join(tarea)
else:
concat = concat + ','.join(tarea) +"%"
ultimo-=1try:
print(concat)
file.write(concat)
finally:
file.close()
definputTask(self):
print("--- Hola usuario, vas a ingresar tareas ---")
name = input("Name=> ")
description = input("Description=> ")
deadline = input("Deadline=> ")
status = input("Status=> ")
lista = [name,description,deadline,status]
self.storeTask(lista)
defstoreTask(self,lista):
self.tareas.append(lista)
self.write()
defupdate(self, buscado):
encontrado = self.searchFilter(buscado)
if encontrado!=None:
print("-- UPDATE --")
tarea[0] = input("name -> ")
tarea[1] = input("descrp -> ")
tarea[2] = input("deadline -> ")
tarea[3] = input("status -> ")
print("✅ Modificado ✅")
self.write()
else:
print("\nNo se encontro ese elemento")
print("\n---- Estas son las tareas que existen ----")
for tarea in self.tareas:
print(tarea[0]+"\r")
defdelete(self,buscado):
encontrado = self.searchFilter(buscado)
if encontrado!=None:
print("-- DELETE --")
self.tareas.remove(encontrado)
print("✅ Borrado ✅")
else:
print("\nNo se encontro ese elemento")
print("\n---- Estas son las tareas que existen ----")
for tarea in self.tareas:
print(tarea[0]+"\r")
deflistar(self):for tarea in self.tareas:
print(tarea)
defsearchFilter(self, search):for tarea in self.tareas:
if tarea[0]== search:
return tarea
returnNone
Muy bien ahora si, empecemos a ver las funciones dentro de la clase Task.
La función init(self), esto función vendría a ser un equivalente del constructor en Java para los que ya saben, para los que recién comienzan veánlo asi, cuando mandemos a llamar a la clase Task queremos definir la lista “tareas” que será usada para cargar los datos del fichero a un array y asi podamos modificarlos, pero para ello debemos leer lo valores que hemos guardado anteriormente en el archivo Task.txt y por eso mandamos a llamar a la función read() que leera todos los datos guardados en el fichero y los metera en un lista.
def__init__(self):
self.tareas = []
self.read()
Ahora con ustedes querido público la tan mencionada función read().
Ese “open” crear un archivo Task.txt (si no lo hay, si lo hubiera trabaja con el existente), con la opción de “r” de read (leer), y con el encoding utf-8 (nos ayudará con las tildes y los caracteres especiales de nuestro maravilloso idioma), la referencia a ese archivo creado lo guardamos en la variable llamada “f”.
Luego ingresa el try and finally (esto permite captura un error si ocurriese al momento de leer el fichero y que el programa no se cierre de forma abrupta, dejando al cliente helado preguntándose que hizo mal).
Ahora las siguientes 3 lineas necesitan un poco de contexto, se supone que pondrás varias tareas (gym, lavar platos, estudiar python, ver java), distintas tareas se guardan separándolas con este símbolo “%”, pero cada tarea tiene un contenido (nombre, descripción, fecha en la que se debe de cumplir y el estado) y estos contenidos se separan con este símbolo “,”. Ya sé está cosa esta algo complicada, pero no te vayas ya entraste aquí.
Ya dado el contexto, te acuerdas que la referencia al archivo creado lo guardamos en “f”, pues este archivo tiene un método llamado read() que a su vez tiene un método llamado split(). Ahora piensa cada tarea esta separada por “%” y si logramos cortar cada vez que veamos este símbolo y añadirlo a una lista podríamos obtener una lista donde cada elemento es una tarea que hemos escrito. Y eso amigos lo logramos con split() el cual devuelve una lista con las tareas escritas, lo único que el hace es cada vez que vea este símbolo “%” lo corta y lo mete en una lista. Eso lo guardamos en la variable “partes”.
Recuerda que una lista es más o menos asi:
A = ['nunca','pares','de','aprender']
Mira lo que obtenemos imprimiendo la variable “partes”:
Vez que solo tenemos separados las tareas pero no su contenido, que pasa si queremos solo modificar una parte de la tarea y para eso a la lista “partes” le hacemos un split(), y le decimos que cada vez que vea este simbolo “,” lo corte y lo meta en una lista, de eso se encarga ese for que vemos.
Y listo tenemos separados por tareas y contenido. Y todo esto se guardo en la lista tareas que estaba en la función init(), pero ¿porque?. Pues porque queremos que todas las funciones puedan usar esa lista y trabajar con ella.
##Read the filedefread(self):
f = open("Task.txt","r",encoding='utf-8')
try:
#split() devuelve una lista
partes = f.read().split('%')
for parte in partes:
self.tareas.append(parte.split(','))
finally:
f.close()
Uff esto está haciéndose un poco largo de explicar 😣😣🥱.
Ahora les presento el write (escribir), que básicamente lo que hay en la lista lo guarda o escribe en el fichero Task.txt para que no se nos pierda.
Ahora debemos hacer el proceso que hicimos en read() pero a la inversa. Tomar el contenido de cada tarea y concatenarlo separado por este símbolo “,”. De la misma forma, concatenar las diferentes tareas por este símbolo “%”. Y una vez hecho ello obtenemos un solo string (un solo texto) que guardamos directo en el fichero Task.txt.
Sé que todo esto parece que lo complica pero en realidad permite saber que es cada cosa, y no solo amontonarlo sin saber donde empieza y termina una tarea o su contenido.
# Write in the filedefwrite(self):
file = open("Task.txt","w",encoding='utf-8')
#Concatenar todos los valores de la lista en un string, # separados por una coma
concat =""
ultimo = len(self.tareas)
for tarea in self.tareas:
if ultimo==1:
concat = concat + ','.join(tarea)
else:
concat = concat + ','.join(tarea) +"%"
ultimo-=1try:
print(concat)
file.write(concat)
finally:
file.close()
Ya casi acabamos, fuerza 💪🏽
Y ahora con nosotros por única vez en LATAM, el inputTask()
Esto permite ingresar un tarea y guardarlo en la lista tareas. Ya sabes para que todos puedan trabajar con esa lista y manipularlo.
definputTask(self):
print("--- Hola usuario, vas a ingresar tareas ---")
name = input("Name=> ")
description = input("Description=> ")
deadline = input("Deadline=> ")
status = input("Status=> ")
lista = [name,description,deadline,status]
self.storeTask(lista)
defstoreTask(self,lista):
self.tareas.append(lista)
self.write()
Vamos con el update(self, buscado), este es especial porque nos pide un parámetro llamado “buscado”, y esto básicamente es la tarea que estás buscando (valga la redundancia) para modificar pues, luego manda llamar a searchFilter(buscado) que pues básicamente lo busca y nos dice si lo encontró o no.
defupdate(self, buscado):
encontrado = self.searchFilter(buscado)
if encontrado!=None:
print("-- UPDATE --")
tarea[0] = input("name -> ")
tarea[1] = input("descrp -> ")
tarea[2] = input("deadline -> ")
tarea[3] = input("status -> ")
print("✅ Modificado ✅")
self.write()
else:
print("\nNo se encontro ese elemento")
print("\n---- Estas son las tareas que existen ----")
for tarea in self.tareas:
print(tarea[0]+"\r")
defsearchFilter(self, search):for tarea in self.tareas:
if tarea[0]== search:
return tarea
returnNone
Ahora la función delete(self, buscado), que le pasas un argumento con la tarea que quieres eliminar (simplemente lo remueve de la lista, si si la de tareas recuerdalo)
defdelete(self,buscado):
encontrado = self.searchFilter(buscado)
if encontrado!=None:
print("-- DELETE --")
self.tareas.remove(encontrado)
print("✅ Borrado ✅")
else:
print("\nNo se encontro ese elemento")
print("\n---- Estas son las tareas que existen ----")
for tarea in self.tareas:
print(tarea[0]+"\r")
defsearchFilter(self, search):for tarea in self.tareas:
if tarea[0]== search:
return tarea
returnNone
Y por último (y no menos importante), que pasa si solo quiere ver tus tareas para ese día, lo que necesitas es listar la lista “tareas” y listo.
deflistar(self):for tarea in self.tareas:
print(tarea)
Disculpen si corrí en algunas partes, es que llevo 2 horas aquí, entre hacer el código y explicarlo. Espero les sirva amada comunidad. Bendiciones en su aprendizaje. 💚💚NUNCA PARES DE APRENDER 💚💚