# importing the module import sys # this function will be the first to run as soon as the main function executes def initial_phonebook(): rows, cols = int(input("Please enter initial number of contacts: ")), 5 # We are collecting the initial number of contacts the user wants to have in the # phonebook already. User may also enter 0 if he doesn't wish to enter any. phone_bookA = open("records.txt", 'a') phone_bookR = open("records.txt", 'r') print(phone_bookR.read()) for i in range(rows): print("\nEnter contact %d details in the following order (ONLY):" % (i + 1)) print("NOTE: * indicates mandatory fields") print("....................................................................") temp = [] for j in range(cols): # We have taken the conditions for values of j only for the personalized fields # such as name, number, e-mail id, dob, category etc if j == 0: temp.append(str(input("Enter name*: "))) # We need to check if the user has left the name empty as its mentioned that # name & number are mandatory fields. # So implement a condition to check as below. if temp[j] == '' or temp[j] == ' ': sys.exit( "Name is a mandatory field. Process exiting due to blank field...") # This will exit the process if a blank field is encountered. if j == 1: temp.append(int(input("Enter number*: "))) # We do not need to check if user has entered the number because int automatically # takes care of it. Int value cannot accept a blank as that counts as a string. # So process automatically exits without us using the sys package. if j == 2: temp.append(str(input("Enter e-mail address: "))) # Even if this field is left as blank, None will take the blank's place if temp[j] == '' or temp[j] == ' ': temp[j] = None if j == 3: temp.append(str(input("Enter date of birth(dd/mm/yy): "))) # Whatever format the user enters dob in, it won't make a difference to the compiler # Only while searching the user will have to enter query exactly the same way as # he entered during the input so as to ensure accurate searches if temp[j] == '' or temp[j] == ' ': # Even if this field is left as blank, None will take the blank's place temp[j] = None if j == 4: temp.append( str(input("Enter category(Family/Friends/Work/Others): "))) # Even if this field is left as blank, None will take the blank's place if temp[j] == "" or temp[j] == ' ': temp[j] = None for record in temp: phone_bookA.write(str(record) + ",") phone_bookA.write("\n") # By this step we are appending a list temp into a list phone_book # That means phone_book is a 2-D array and temp is a 1-D array print(phone_bookR.read()) return phone_bookR.read() def menu(): # We created this simple menu function for # code reusability & also for an interactive console # Menu func will only execute when called print("********************************************************************") print("\t\t\tSMARTPHONE DIRECTORY", flush=False) print("********************************************************************") print("\tYou can now perform the following operations on this phonebook\n") print("1. Add a new contact") print("2. Remove an existing contact") print("3. Delete all contacts") print("4. Search for a contact") print("5. Display all contacts") print("6. Exit phonebook") # Out of the provided 6 choices, user needs to enter any 1 choice among the 6 # We return the entered choice to the calling function wiz main in our case choice = int(input("Please enter your choice: ")) return choice def add_contact(): # Adding a contact is the easiest because all you need to do is: # append another list of details into the already existing list dip = [] for i in range(5): if i == 0: dip.append(str(input("Enter name: "))) if i == 1: dip.append(str(input("Enter number: "))) if i == 2: dip.append(str(input("Enter e-mail address: "))) if i == 3: dip.append(str(input("Enter date of birth(dd/mm/yy): "))) if i == 4: dip.append( str(input("Enter category(Family/Friends/Work/Others): "))) pb = open("records.txt", 'a') for record in dip: pb.write(record + ",") pb.write("\n") pb.close() def remove_existing(): pbr = open("records.txt", 'r') pbw = open("records.txt", 'w') # This function is to remove a contact's details from existing phonebook query = str( input("Please enter the name of the contact you wish to remove: ")) # We'll collect name of the contact and search if it exists in our phonebook pb = [] temp = 0 # temp is a checking variable here. We assigned a value 0 to temp. for i in range(len(pb)): if query == pbr[i][0]: temp += 1 # Temp will be incremented & it won't be 0 anymore in this function's scope print(pb.pop(i)) # The pop function removes entry at index i print("This query has now been removed") # printing a confirmation message after removal. # This ensures that removal was successful. # After removal we will return the modified phonebook to the calling function # which is main in our program return pb if temp == 0: # Now if at all any case matches temp should've incremented but if otherwise, # temp will remain 0 and that means the query does not exist in this phonebook print("Sorry, you have entered an invalid query.\ Please recheck and try again later.") return pb def delete_all(): # This function will simply delete all the entries in the phonebook pb # It will return an empty phonebook after clearing pb = open("records.txt", 'w') pb.write("") def search_existing(): # This function searches for an existing contact and displays the result choice = int(input("Enter search criteria\n\n\ 1. Name\n2. Number\n3. Email-id\n4. DOB\n5. Category(Family/Friends/Work/Others)\ \nPlease enter: ")) # We're doing so just to ensure that the user experiences a customized search result temp = [] check = -1 if choice == 1: # This will execute for searches based on contact name query = str( input("Please enter the name of the contact you wish to search: ")) for i in range(len(pb)): if query == pb[i][0]: check = i temp.append(pb[i]) elif choice == 2: # This will execute for searches based on contact number query = int( input("Please enter the number of the contact you wish to search: ")) for i in range(len(pb)): if query == pb[i][1]: check = i temp.append(pb[i]) elif choice == 3: # This will execute for searches based on contact's e-mail address query = str(input("Please enter the e-mail ID\ of the contact you wish to search: ")) for i in range(len(pb)): if query == pb[i][2]: check = i temp.append(pb[i]) elif choice == 4: # This will execute for searches based on contact''s date of birth query = str(input("Please enter the DOB (in dd/mm/yyyy format ONLY)\ of the contact you wish to search: ")) for i in range(len(pb)): if query == pb[i][3]: check = i temp.append(pb[i]) elif choice == 5: # This will execute for searches based on contact category query = str( input("Please enter the category of the contact you wish to search: ")) for i in range(len(pb)): if query == pb[i][4]: check = i temp.append(pb[i]) # All contacts under query category will be shown using this feature else: # If the user enters any other choice then the search will be unsuccessful print("Invalid search criteria") return -1 # returning -1 indicates that the search was unsuccessful # all the searches are stored in temp and all the results will be displayed with # the help of display function if check == -1: return -1 # returning -1 indicates that the query did not exist in the directory else: display_all(temp) return check # we're just returning a index value wiz not -1 to calling function just to notify # that the search worked successfully # this function displays all content of phonebook pb def display_all(pb): if not pb: # if display function is called after deleting all contacts then the len will be 0 # And then without this condition it will throw an error print("List is empty: []") else: for i in range(len(pb)): print(pb[i]) def thanks(): # A simple gesture of courtesy towards the user to enhance user experience print("********************************************************************") print("Thank you for using our Smartphone directory system.") print("Please visit again!") print("********************************************************************") sys.exit("Goodbye, have a nice day ahead!") # Main function code print("....................................................................") print("Hello dear user, welcome to our smartphone directory system") print("You may now proceed to explore this directory") print("....................................................................") # This is solely meant for decoration purpose only. # You're free to modify your interface as per your will to make it look interactive ch = 1 initial_phonebook() while ch in (1, 2, 3, 4, 5): ch = menu() if ch == 1: add_contact() elif ch == 2: remove_existing() elif ch == 3: delete_all() elif ch == 4: d = search_existing() if d == -1: print("The contact does not exist. Please try again") elif ch == 5: display_all() else: thanks()