How to make a Todo List CLI application using Python ?
Last Updated :
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
import sys
import 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
def help ():
sa =
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
def add(s):
f = open ( 'todo.txt' , 'a' )
f.write(s)
f.write( "\n" )
f.close()
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
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
|
Function to Complete a todo: Function defines the completed task and this completed task is added in done.txt.
Python3
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." )
|
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
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)}' )
|
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
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." )
|
Main function and utility function
Python3
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 =
sys.stdout. buffer .write(s.encode( 'utf8' ))
|
Below is the implementation:
Python3
import sys
import datetime
def help ():
sa =
sys.stdout. buffer .write(sa.encode( 'utf8' ))
def add(s):
f = open ( 'todo.txt' , 'a' )
f.write(s)
f.write( "\n" )
f.close()
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 =
sys.stdout. buffer .write(s.encode( 'utf8' ))
|
Output:
Share your thoughts in the comments
Please Login to comment...