Python Contact Book Example
A small contact book project is a great way to practice Python basics.
In this example, you will build a simple command-line program that:
- stores contact names and phone numbers
- asks the user for input
- searches for contacts
- deletes contacts
- repeats with a menu until the user exits
This project is beginner-friendly because it uses a few core ideas in a practical way.
What this project builds
This example creates:
- A simple command-line contact book
- A program that stores contact names and phone numbers
- A menu that lets the user add, view, search, and delete contacts
- A good beginner project for practicing dictionaries and loops
Skills this example practices
While building this project, you will practice:
- Using a dictionary to store related data
- Using a
whileloop for a repeating menu - Using
input()to get user input - Using
ifandelifto handle menu options - Checking if a key exists before reading or deleting it
How the contact data is stored
The program uses a dictionary named contacts.
- Each key is a contact name
- Each value is that contact's phone number
Example:
contacts = {
"Alice": "1234567890",
"Bob": "5551234567"
}
This keeps the project simple and easy to understand.
If you are new to dictionaries, see Python dictionaries explained.
Build the menu step by step
The basic idea is:
- Start with an empty dictionary
- Use
while Trueto keep showing the menu - Read the user's choice with
input() - Run different code based on the choice
- Use
breakto exit
Here is the full working script:
contacts = {}
while True:
print("\n1. Add contact")
print("2. View contacts")
print("3. Search contact")
print("4. Delete contact")
print("5. Exit")
choice = input("Choose an option: ")
if choice == "1":
name = input("Name: ")
phone = input("Phone: ")
contacts[name] = phone
print("Contact saved.")
elif choice == "2":
if not contacts:
print("No contacts found.")
else:
for name, phone in contacts.items():
print(name, "-", phone)
elif choice == "3":
name = input("Enter name to search: ")
if name in contacts:
print(name, "-", contacts[name])
else:
print("Contact not found.")
elif choice == "4":
name = input("Enter name to delete: ")
if name in contacts:
del contacts[name]
print("Contact deleted.")
else:
print("Contact not found.")
elif choice == "5":
print("Goodbye!")
break
else:
print("Invalid option.")
How this works
contacts = {}creates an empty dictionarywhile True:creates a loop that keeps runningchoice = input(...)reads the menu optionif,elif, andelsedecide which action to runbreakstops the loop when the user chooses to exit
Add a new contact
To add a contact, ask for the name and phone number, then save it in the dictionary.
name = input("Name: ")
phone = input("Phone: ")
contacts[name] = phone
print("Contact saved.")
Key line:
contacts[name] = phone
This stores the phone number under the contact name.
Example:
contacts["Alice"] = "1234567890"
After that, the dictionary becomes:
{"Alice": "1234567890"}
One important detail: if the same name is added again, the old phone number is replaced. That happens because dictionary keys must be unique.
View all contacts
To show all contacts, first check whether the dictionary is empty.
if not contacts:
print("No contacts found.")
else:
for name, phone in contacts.items():
print(name, "-", phone)
This does two things:
if not contacts:checks whether the dictionary is emptycontacts.items()gives you each name and phone number pair
If you want more help with this pattern, see how to loop through a dictionary in Python and the dict.items() method reference.
Example output:
Alice - 1234567890
Bob - 5551234567
Search for a contact safely
When searching, do not directly use contacts[name] unless you know the name exists.
Use a key check first:
name = input("Enter name to search: ")
if name in contacts:
print(name, "-", contacts[name])
else:
print("Contact not found.")
This avoids a KeyError.
Why this matters:
- If the name exists, you can safely read the phone number
- If the name does not exist, the program prints a clear message instead of crashing
If you want more detail, see how to check if a key exists in a dictionary in Python and KeyError in Python: causes and fixes.
Delete a contact safely
Deleting follows the same idea as searching.
Check first, then delete:
name = input("Enter name to delete: ")
if name in contacts:
del contacts[name]
print("Contact deleted.")
else:
print("Contact not found.")
Key line:
del contacts[name]
This removes the contact from the dictionary, but only if the name exists.
Common beginner improvements
Once the basic version works, you can improve it in simple ways:
- Store more than one field per contact
- Use nested dictionaries for phone and email
- Make name search case-insensitive
- Sort contacts before printing
- Save contacts to a file later
For example, a contact could look like this:
contacts = {
"Alice": {
"phone": "1234567890",
"email": "alice@example.com"
}
}
A useful next step is saving your contacts to a JSON file. See how to parse JSON in Python.
Beginner debugging tips
If your program does not behave as expected, test one small part at a time.
Helpful debug lines:
print(contacts)
print(choice)
print(type(choice))
print(name in contacts)
for name, phone in contacts.items():
print(name, phone)
These can help you check:
- whether contacts are being stored correctly
- what the user actually entered
- whether
choiceis a string - whether a name exists in the dictionary
- whether the loop is reading your data correctly
Common mistakes
Here are some common beginner problems in this project.
Using contacts[name] before checking if the name exists
This can raise a KeyError.
Problem example:
name = input("Enter name: ")
print(contacts[name])
Safer version:
if name in contacts:
print(contacts[name])
else:
print("Contact not found.")
Forgetting that input() returns a string
This is a very common issue.
Problem example:
choice = input("Choose an option: ")
if choice == 1:
print("Add contact")
This does not match because choice is a string, not a number.
Correct version:
if choice == "1":
print("Add contact")
You can confirm this with:
print(type(choice))
Indentation mistakes inside the while loop
Python uses indentation to define blocks of code.
For example, this is wrong:
while True:
print("Menu")
This causes an indentation error.
Correct version:
while True:
print("Menu")
If you see this problem, read IndentationError: expected an indented block.
Overwriting a contact by using the same name again
This is valid Python behavior, but beginners sometimes do not expect it.
Example:
contacts["Alice"] = "1111111111"
contacts["Alice"] = "2222222222"
print(contacts)
Output:
{'Alice': '2222222222'}
The second value replaces the first one.
Using contacts.items instead of contacts.items()
This is another common mistake.
Wrong:
for name, phone in contacts.items:
print(name, phone)
Correct:
for name, phone in contacts.items():
print(name, phone)
The parentheses are required because items() is a method.
FAQ
Why is a dictionary used for this project?
A dictionary lets you look up a contact by name quickly and keeps the example simple.
What happens if I add the same name twice?
The new phone number replaces the old value because dictionary keys must be unique.
Can I store email addresses too?
Yes. A good next step is to store each contact as a nested dictionary with fields like phone and email.
Why does my menu choice not match?
input() returns text, so compare against string values like "1" instead of the number 1.
How can I save contacts after the program closes?
A good next improvement is saving the dictionary to a file, such as JSON.
See also
- Python dictionaries explained
- How to get user input in Python
- How to loop through a dictionary in Python
- How to check if a key exists in a dictionary in Python
- Python
dict.items()method - KeyError in Python: causes and fixes
- Python to-do list script example
After you build the basic contact book, try improving it by adding email fields, duplicate checks, sorting, and file saving with JSON.