Listing 09-06: Controlling a phonebook

##############################################################################
# Python From Scratch
# Autor: Nilo Ney Coutinho Menezes
# Editora Novatec (c) 2010-2024
# Site: https://pythonfromscratch.com
#
# File: listing\chapter 09\09.06 - Controlling a phonebook.py
# Description: Controlling a phonebook
##############################################################################

phonebook = []
def ask_name():
    return input("Name: ")
def ask_telephone():
    return input("Phone: ")
def show_data(name, phone):
    print(f"Name: {name} Phone: {phone}")
def ask_filename():
    return input("File name: ")
def search(name):
    name = name.lower()
    for p, e in enumerate(phonebook):
        if e[0].lower() == name:
            return p
    return None
def new():
    name = ask_name()
    telephone = ask_telephone()
    phonebook.append([name, phone])
def delete():
    name = ask_name()
    p = search(name)
    if p is not None:
        del phonebook[p]
    else:
        print("Name not found.")
def update():
    p = search(ask_name())
    if p is not None:
        name = phonebook[p][0]
        phone = phonebook[p][1]
        print("Found:")
        show_data(name, phone)
        name = ask_name()
        telephone = ask_telephone()
        phonebook[p] = [name, phone]
    else:
        print("Name not found.")
def list():
    print("\nPhonebook\n\n------")
    for e in phonebook:
        show_data(e[0], e[1])
    print("------\n")
def load():
    global phonebook
    filename = ask_filename()
    with open(filename, "r", encoding="utf-8") as file:
        phonebook = []
        for line in file.readlines():
            name, phone = line.strip().split("#")
            phonebook.append([name, phone])
def save():
    filename = ask_filename()
    with open(filename, "w", encoding="utf-8") as file:
        for e in phonebook:
            file.write(f"{e[0]}#{e[1]}\n")
def validate_integer_range(question, start, end):
    while True:
        try:
            value = int(input(question))
            if start <= value <= end:
                return value
        except ValueError:
            print(f"Invalid value, please type between {start} and {end}")
def menu():
    print("""
  1 - New
  2 - Update
  3 - Delete
  4 - List
  5 - Save
  6 - Load

  0 - Exit
""")
    return validate_integer_range("Choose an option: ", 0, 6)
while option := menu():
    if option == 0:
        break
    elif option == 1:
        new()
    elif option == 2:
        update()
    elif option == 3:
        delete()
    elif option == 4:
        list()
    elif option == 5:
        save()
    elif option == 6:
        load()
Click here to download the file