How to make a Todo List CLI application using Python ?

17 May, 2022
In this article, we see how to make a Command Line application todo list in python. Todo list is a basic application in which users can add items.  It’s a list of tasks you need to complete or things that you want to do.  In to-do, list tasks are organized in order of priority.   One of the most important reasons you should use a to-do list is that it will help you stay organized. 
In this article we make a to-do list using the command line. By Using a to-do list as a command-line application we can organize our to-do list through a command prompt, and we do not need to run any script or program explicitly.
Basic Functions of todo list are:
Add a new todo
Delete a todo
Complete a todo
Show remaining todos
Show statistics of todo
Example
Note: In Windows Command Prompt to run the application → type todo or.\todo
In shell or git bash  -->     type ./todo
To create todo list application we have to follow these steps:
Create a folder named todolist
Create a file todo.py in the created folder
If you are a window user then Create another file todo.bat file. This is a batch file. And it is used to run the python script
If you are Linux user then create  a file named as todo.sh. This is used to run the python script.
                                                                                         
                                
todo.bat:
@echo off
python3 todo.py %1 %2
todo.sh:
python todo.py "$@"
Create a symbolic link to the executable file:
In Windows (In command prompt or Powershell)
To create a symbolic link on Windows, you’ll need to run either the Windows Command Prompt or Windows Powershell **with administrator privileges**. To do so, right-click on the icon for Command Prompt, or Powershell, and choose the _”Run as Administrator”_ option.
mklink todo todo.bat
In Linux or in the shell(as git bash)
$ ln -s todo.sh todo
Now we have to code the functions of our to-do list.
So we write the code in todo.py
Python3
# module requiredimport sysimport datetime
Help function: The help function is used to provide the way how a user can use the todo list.  And Help function is like the documentation of todo application. 
Python3
# help functiondef 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'))
Function to add items in todo list: Add function is used to add new items to todo list
Python3
# function to add item in todo listdef add(s):       f = open('todo.txt', 'a')    f.write(s)    f.write("\n")    f.close()    s = '"'+s+'"'    print(f"Added todo: {s}")
The function to print the todo list function is used to print the items that are present in our todo list. Todo items are printed in ascending order.
Python3
# Function to print the todo list itemsdef 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
Function to Complete a todo: Function defines the completed task and this completed task is added in done.txt. 
Python3
# Function to Complete a tododef 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.")
Function to show the statistics of todolist: The “report” function is used to show the complete statistics. It prints total no of the completed task and total no of the pending task.
Python3
# Function to show report/statistics of todo listdef 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)}')
Function to delete an item from todo list: deL function is used to delete an item from todo list. It deletes todo item based on the item number
Python3
# codedef 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.")
Main function and utility function
Python3
# codedef 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 programif __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'))
Below is the implementation:
Python3
# Complete codeimport sysimport 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'))
Output:
sagartomar9927
Python-projects
python-utility
Technical Scripter 2020
Python
Technical Scripter
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
How to Install PIP on Windows ?
Python Classes and Objects
Python OOPs Concepts
Introduction To PYTHON
How to drop one or multiple columns in Pandas Dataframe
Python | os.path.join() method
How To Convert Python Dictionary To JSON?
Check if element exists in list in Python
Python | datetime.timedelta() function
Python | Get unique values from a list