Mini-projet — Carnet de contacts
Le projet
Tu vas construire un carnet de contacts en ligne de commande. L'utilisateur peut ajouter des contacts, les lister, les rechercher et les supprimer. Tout est sauvegardé dans un fichier texte.
Ce projet utilise tout ce que tu as appris dans ce module : variables, conditions, boucles, fonctions, listes, dictionnaires et fichiers. Aucune bibliothèque externe n'est nécessaire.
Ce que le programme fera
=== Carnet de contacts ===
1. Ajouter un contact
2. Lister tous les contacts
3. Rechercher un contact
4. Supprimer un contact
5. Quitter
Choix : 1
Nom : Emma
Téléphone : 06 12 34 56 78
Email : emma@mail.fr
Contact ajouté !
Choix : 2
--- Tes contacts ---
Emma | 06 12 34 56 78 | emma@mail.fr
---
Structure du projet
On va découper le code en fonctions claires, une par fonctionnalité.
# carnet.py
# Carnet de contacts en ligne de commande
# Pas de bibliothèque externe nécessaire
FICHIER = "contacts.txt"
# ──────────────────────────────────────────
# Fonctions de chargement / sauvegarde
# ──────────────────────────────────────────
def charger_contacts():
"""Lit le fichier et retourne une liste de dicts."""
contacts = []
try:
with open(FICHIER, "r", encoding="utf-8") as f:
for ligne in f:
parties = ligne.strip().split("|")
if len(parties) == 3:
contacts.append({
"nom": parties[0],
"tel": parties[1],
"email": parties[2]
})
except FileNotFoundError:
pass # pas encore de fichier, c'est normal
return contacts
def sauvegarder_contacts(contacts):
"""Écrit la liste de contacts dans le fichier."""
with open(FICHIER, "w", encoding="utf-8") as f:
for c in contacts:
f.write(f"{c['nom']}|{c['tel']}|{c['email']}\n")
# ──────────────────────────────────────────
# Fonctions métier
# ──────────────────────────────────────────
def ajouter_contact(contacts):
nom = input("Nom : ").strip()
tel = input("Téléphone : ").strip()
email = input("Email : ").strip()
if not nom:
print("Le nom est obligatoire.")
return
contacts.append({"nom": nom, "tel": tel, "email": email})
sauvegarder_contacts(contacts)
print(f"Contact '{nom}' ajouté !")
def lister_contacts(contacts):
if not contacts:
print("Aucun contact pour l'instant.")
return
print("\n--- Tes contacts ---")
for c in contacts:
print(f"{c['nom']} | {c['tel']} | {c['email']}")
print("---\n")
def rechercher_contact(contacts):
terme = input("Rechercher (nom ou email) : ").lower()
resultats = [
c for c in contacts
if terme in c["nom"].lower() or terme in c["email"].lower()
]
if resultats:
for c in resultats:
print(f" {c['nom']} | {c['tel']} | {c['email']}")
else:
print("Aucun résultat.")
def supprimer_contact(contacts):
nom = input("Nom du contact à supprimer : ")
avant = len(contacts)
contacts[:] = [c for c in contacts if c["nom"].lower() != nom.lower()]
if len(contacts) < avant:
sauvegarder_contacts(contacts)
print("Contact supprimé.")
else:
print("Contact introuvable.")
# ──────────────────────────────────────────
# Boucle principale
# ──────────────────────────────────────────
def main():
contacts = charger_contacts()
while True:
print("\n=== Carnet de contacts ===")
print("1. Ajouter un contact")
print("2. Lister tous les contacts")
print("3. Rechercher un contact")
print("4. Supprimer un contact")
print("5. Quitter")
choix = input("\nChoix : ").strip()
if choix == "1":
ajouter_contact(contacts)
elif choix == "2":
lister_contacts(contacts)
elif choix == "3":
rechercher_contact(contacts)
elif choix == "4":
supprimer_contact(contacts)
elif choix == "5":
print("À bientôt !")
break
else:
print("Choix invalide. Tape 1, 2, 3, 4 ou 5.")
if __name__ == "__main__":
main()
Comment lancer ce projet ?
- Crée un nouveau fichier dans Thonny ou IDLE. Nomme-le
carnet.py. - Copie-colle tout le code ci-dessus.
- Appuie sur F5 pour lancer.
- Le programme crée automatiquement
contacts.txtdans le même dossier.
Pour aller plus loin
Tu as fini le module ! Voici des idées pour améliorer ce projet et continuer à progresser :
- Trier les contacts par ordre alphabétique avant de les afficher.
- Vérifier que l'email contient un
@avant d'accepter le contact. - Stocker les données en JSON au lieu de texte brut (module
json). - Ajouter un champ "date d'ajout" avec le module
datetime. - Créer une interface graphique avec
tkinter(inclus dans Python).
if __name__ == "__main__": est une convention Python.
Elle permet d'importer ce fichier comme module dans un autre programme
sans que la fonction main() se lance automatiquement.
Bonne habitude à prendre dès le départ.
- Découper un programme en petites fonctions claires, c'est la bonne façon de coder.
- Une fonction = une responsabilité. Facile à tester, facile à modifier.
- Charger au début, sauvegarder après chaque modification : bonne pratique fichiers.
- La boucle
while True:+breakest le pattern classique des menus. - Tu sais maintenant coder en Python. La suite : explore les projets qui t'intéressent.