Leçon 10 / 10
Leçon 10 · Partie 2 — Structures et projet

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

Terminal
=== 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é.

Python
# 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")
Python (suite)
# ──────────────────────────────────────────
# 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.")
Python (boucle principale)
# ──────────────────────────────────────────
# 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 ?

  1. Crée un nouveau fichier dans Thonny ou IDLE. Nomme-le carnet.py.
  2. Copie-colle tout le code ci-dessus.
  3. Appuie sur F5 pour lancer.
  4. Le programme crée automatiquement contacts.txt dans 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.

// À retenir
  • 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: + break est le pattern classique des menus.
  • Tu sais maintenant coder en Python. La suite : explore les projets qui t'intéressent.