¿Cómo hacer una aplicación CLI de Todo List usando Python?

En este artículo, vemos cómo crear una lista de tareas pendientes de una aplicación de línea de comandos en python. Todo list es una aplicación básica en la que los usuarios pueden agregar elementos. Es una lista de tareas que necesita completar o cosas que desea hacer. En tareas pendientes, las tareas de la lista se organizan en orden de prioridad. Una de las razones más importantes por las que debe usar una lista de tareas pendientes es que lo ayudará a mantenerse organizado. 

En este artículo hacemos una lista de tareas pendientes usando la línea de comando. Al usar una lista de tareas pendientes como una aplicación de línea de comandos, podemos organizar nuestra lista de tareas pendientes a través de un símbolo del sistema, y ​​no necesitamos ejecutar ningún script o programa explícitamente.

Las funciones básicas de la lista de tareas pendientes son:

  • Añadir una nueva tarea pendiente
  • eliminar una tarea pendiente
  • completar una tarea
  • Mostrar todos los restantes
  • Mostrar estadísticas de todo

Ejemplo

Nota: en el símbolo del sistema de Windows para ejecutar la aplicación → escriba todo o.\todo

In shell or git bash  -->     type ./todo
  • Para crear una aplicación de lista de tareas tenemos que seguir estos pasos:
  • Crear una carpeta llamada lista de tareas
  • Crea un archivo todo.py en la carpeta creada
  • Si es un usuario de Windows, cree otro archivo todo.bat. Este es un archivo por lotes. Y se usa para ejecutar el script de python.
  • Si es usuario de Linux, cree un archivo llamado todo.sh. Esto se usa para ejecutar el script de python.

                                                                                         

                                

todo.bat:

@echo off
python3 todo.py %1 %2

todo.sh:

python todo.py "$@"

Cree un enlace simbólico al archivo ejecutable:

En Windows (En el símbolo del sistema o Powershell)

Para crear un vínculo simbólico en Windows, deberá ejecutar el Símbolo del sistema de Windows o Windows Powershell **con privilegios de administrador**. Para hacerlo, haga clic con el botón derecho en el icono de Símbolo del sistema o Powershell y elija la opción _”Ejecutar como administrador”_.

mklink todo todo.bat

En Linux o en el shell (como git bash)

$ ln -s todo.sh todo

Ahora tenemos que codificar las funciones de nuestra lista de tareas pendientes.

Entonces escribimos el código en todo.py

Python3

# module required
import sys
import datetime

Función de ayuda: La función de ayuda se utiliza para proporcionar la forma en que un usuario puede utilizar la lista de tareas pendientes. Y la función de ayuda es como la documentación de la aplicación de tareas pendientes. 

Python3

# help function
def help():
    sa = """Usage :-
$ ./todo add "todo item"  # Add a new todo
$ ./todo ls               # Show remaining todos
$ ./todo del NUMBER       # Delete a todo
$ ./todo done NUMBER      # Complete a todo
$ ./todo help             # Show usage
$ ./todo report           # Statistics"""
    sys.stdout.buffer.write(sa.encode('utf8'))

Función para agregar elementos en la lista de tareas pendientes : la función Agregar se usa para agregar nuevos elementos a la lista de tareas pendientes

Python3

# function to add item in todo list
def add(s):
   
    f = open('todo.txt', 'a')
    f.write(s)
    f.write("\n")
    f.close()
    s = '"'+s+'"'
    print(f"Added todo: {s}")

La función para imprimir la función de lista de tareas se utiliza para imprimir los elementos que están presentes en nuestra lista de tareas pendientes. Los elementos de todo se imprimen en orden ascendente.

Python3

# Function to print the todo list items
def ls():
   
    try:
 
        nec()
        l = len(d)
        k = l
 
        for i in d:
            sys.stdout.buffer.write(f"[{l}] {d[l]}".encode('utf8'))
            sys.stdout.buffer.write("\n".encode('utf8'))
            l = l-1
 
    except Exception as e:
        raise e

Función para completar una tarea pendiente: la función define la tarea completada y esta tarea completada se agrega en done.txt. 

Python3

# Function to Complete a todo
def done(no):
    try:
 
        nec()
        no = int(no)
        f = open('done.txt', 'a')
        st = 'x '+str(datetime.datetime.today()).split()[0]+' '+d[no]
         
        f.write(st)
        f.write("\n")
        f.close()
        print(f"Marked todo #{no} as done.")
         
        with open("todo.txt", "r+") as f:
            lines = f.readlines()
            f.seek(0)
             
            for i in lines:
                if i.strip('\n') != d[no]:
                    f.write(i)
            f.truncate()
    except:
        print(f"Error: todo #{no} does not exist.")

Función para mostrar las estadísticas de todolist: La función «informe» se utiliza para mostrar las estadísticas completas. Imprime el número total de la tarea completada y el número total de la tarea pendiente.

Python3

# Function to show report/statistics of todo list
def report():
    nec()
    try:
 
        nf = open('done.txt', 'r')
        c = 1
         
        for line in nf:
            line = line.strip('\n')
            don.update({c: line})
            c = c+1
        print(
            f'{str(datetime.datetime.today()).split()[0]} Pending : {len(d)} Completed : {len(don)}')
     
    except:
        print(
            f'{str(datetime.datetime.today()).split()[0]} Pending : {len(d)} Completed : {len(don)}')

Función para eliminar un elemento de la lista de tareas pendientes: la función deL se utiliza para eliminar un elemento de la lista de tareas pendientes. Elimina el elemento de tareas pendientes en función del número de elemento.

Python3

# code
def deL(no):
    try:
        no = int(no)
        nec()
 
        # utility function defined in main
        with open("todo.txt", "r+") as f:
            lines = f.readlines()
            f.seek(0)
             
            for i in lines:
                if i.strip('\n') != d[no]:
                    f.write(i)
            f.truncate()
        print(f"Deleted todo #{no}")
 
    except Exception as e:
       
        print(f"Error: todo #{no} does not exist. Nothing deleted.")

Función principal y función de utilidad

Python3

# code
def nec():
 
  # utility function used in done and report function
    try:
        f = open('todo.txt', 'r')
        c = 1
        for line in f:
            line = line.strip('\n')
            d.update({c: line})
            c = c+1
    except:
        sys.stdout.buffer.write("There are no pending todos!".encode('utf8'))
 
 
# Main program
if __name__ == '__main__':
    try:
        d = {}
        don = {}
        args = sys.argv
         
        if(args[1] == 'del'):
            args[1] = 'deL'
             
        if(args[1] == 'add' and len(args[2:]) == 0):
            sys.stdout.buffer.write(
                "Error: Missing todo string. Nothing added!".encode('utf8'))
 
        elif(args[1] == 'done' and len(args[2:]) == 0):
            sys.stdout.buffer.write(
                "Error: Missing NUMBER for marking todo as done.".encode('utf8'))
 
        elif(args[1] == 'deL' and len(args[2:]) == 0):
            sys.stdout.buffer.write(
                "Error: Missing NUMBER for deleting todo.".encode('utf8'))
        else:
            globals()[args[1]](*args[2:])
 
    except Exception as e:
 
        s = """Usage :-
$ ./todo add "todo item"  # Add a new todo
$ ./todo ls               # Show remaining todos
$ ./todo del NUMBER       # Delete a todo
$ ./todo done NUMBER      # Complete a todo
$ ./todo help             # Show usage
$ ./todo report           # Statistics"""
        sys.stdout.buffer.write(s.encode('utf8'))

A continuación se muestra la implementación:

Python3

# Complete code
import sys
import datetime
 
 
def help():
    sa = """Usage :-
$ ./todo add "todo item"  # Add a new todo
$ ./todo ls               # Show remaining todos
$ ./todo del NUMBER       # Delete a todo
$ ./todo done NUMBER      # Complete a todo
$ ./todo help             # Show usage
$ ./todo report           # Statistics"""
    sys.stdout.buffer.write(sa.encode('utf8'))
 
 
def add(s):
    f = open('todo.txt', 'a')
    f.write(s)
    f.write("\n")
    f.close()
    s = '"'+s+'"'
    print(f"Added todo: {s}")
 
 
def ls():
    try:
 
        nec()
        l = len(d)
        k = l
 
        for i in d:
            sys.stdout.buffer.write(f"[{l}] {d[l]}".encode('utf8'))
            sys.stdout.buffer.write("\n".encode('utf8'))
            l = l-1
 
    except Exception as e:
        raise e
 
 
def deL(no):
    try:
        no = int(no)
        nec()
        with open("todo.txt", "r+") as f:
            lines = f.readlines()
            f.seek(0)
            for i in lines:
                if i.strip('\n') != d[no]:
                    f.write(i)
            f.truncate()
        print(f"Deleted todo #{no}")
 
    except Exception as e:
        print(f"Error: todo #{no} does not exist. Nothing deleted.")
 
 
def done(no):
    try:
 
        nec()
        no = int(no)
        f = open('done.txt', 'a')
        st = 'x '+str(datetime.datetime.today()).split()[0]+' '+d[no]
        f.write(st)
        f.write("\n")
        f.close()
        print(f"Marked todo #{no} as done.")
         
        with open("todo.txt", "r+") as f:
            lines = f.readlines()
            f.seek(0)
            for i in lines:
                if i.strip('\n') != d[no]:
                    f.write(i)
            f.truncate()
    except:
        print(f"Error: todo #{no} does not exist.")
 
 
def report():
    nec()
    try:
 
        nf = open('done.txt', 'r')
        c = 1
        for line in nf:
            line = line.strip('\n')
            don.update({c: line})
            c = c+1
        print(
            f'{str(datetime.datetime.today()).split()[0]} Pending : {len(d)} Completed : {len(don)}')
    except:
        print(
            f'{str(datetime.datetime.today()).split()[0]} Pending : {len(d)} Completed : {len(don)}')
 
 
def nec():
    try:
        f = open('todo.txt', 'r')
        c = 1
        for line in f:
            line = line.strip('\n')
            d.update({c: line})
            c = c+1
    except:
        sys.stdout.buffer.write("There are no pending todos!".encode('utf8'))
 
 
if __name__ == '__main__':
    try:
        d = {}
        don = {}
        args = sys.argv
        if(args[1] == 'del'):
            args[1] = 'deL'
        if(args[1] == 'add' and len(args[2:]) == 0):
            sys.stdout.buffer.write(
                "Error: Missing todo string. Nothing added!".encode('utf8'))
 
        elif(args[1] == 'done' and len(args[2:]) == 0):
            sys.stdout.buffer.write(
                "Error: Missing NUMBER for marking todo as done.".encode('utf8'))
 
        elif(args[1] == 'deL' and len(args[2:]) == 0):
            sys.stdout.buffer.write(
                "Error: Missing NUMBER for deleting todo.".encode('utf8'))
        else:
            globals()[args[1]](*args[2:])
 
    except Exception as e:
 
        s = """Usage :-
$ ./todo add "todo item"  # Add a new todo
$ ./todo ls               # Show remaining todos
$ ./todo del NUMBER       # Delete a todo
$ ./todo done NUMBER      # Complete a todo
$ ./todo help             # Show usage
$ ./todo report           # Statistics"""
        sys.stdout.buffer.write(s.encode('utf8'))

Producción:

Publicación traducida automáticamente

Artículo escrito por cse4 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *