Python

Programmation Python dans la Pratique : Gestionnaire de Tâches avec Stockage JSON

📌 Introduction

La programmation en Python est idéale pour développer des applications pratiques comme un gestionnaire de tâches. Cet article vous guidera dans la création d’un programme simple mais puissant qui permet d’ajouter, afficher, supprimer et enregistrer des tâches en utilisant un fichier JSON.

📌 Ce que vous allez apprendre :
✅ Manipuler les listes et dictionnaires
✅ Lire et écrire des fichiers JSON
✅ Utiliser des fonctions pour structurer un programme
✅ Créer une interface en ligne de commande interactive


🔹 Étape 1 : Installer Python et Préparer l’Environnement

📌 Installation de Python : Téléchargez-le depuis python.org.
📌 Créer un fichier Python :

touch gestionnaire_taches.py

🔹 Étape 2 : Définir la Structure des Données

Nous allons stocker les tâches dans un fichier JSON, sous forme de liste de dictionnaires.

Exemple de fichier taches.json :

[
    {"tache": "Acheter du lait", "statut": "En cours"},
    {"tache": "Envoyer l'email de confirmation", "statut": "Terminée"}
]

🔹 Étape 3 : Implémenter les Fonctions de Gestion des Tâches

Créons un programme modulaire pour gérer les tâches.

📌 1. Charger et Sauvegarder les Tâches

import json

FICHIER_TACHES = "taches.json"

def charger_taches():
    """Charge les tâches depuis un fichier JSON."""
    try:
        with open(FICHIER_TACHES, "r") as fichier:
            return json.load(fichier)
    except FileNotFoundError:
        return []

def sauvegarder_taches(taches):
    """Sauvegarde les tâches dans un fichier JSON."""
    with open(FICHIER_TACHES, "w") as fichier:
        json.dump(taches, fichier, indent=4)

charger_taches() : Lit le fichier JSON et retourne une liste de tâches.
sauvegarder_taches() : Écrit les tâches dans le fichier JSON.


📌 2. Ajouter une Nouvelle Tâche

def ajouter_tache(taches):
    """Ajoute une nouvelle tâche à la liste."""
    tache = input("Entrez la nouvelle tâche : ")
    taches.append({"tache": tache, "statut": "En cours"})
    print("✅ Tâche ajoutée avec succès !")

✔ Demande une entrée utilisateur et ajoute la tâche à la liste.


📌 3. Afficher la Liste des Tâches

def afficher_taches(taches):
    """Affiche toutes les tâches."""
    if not taches:
        print("📌 Aucune tâche enregistrée.")
    else:
        print("\n📋 Liste des tâches :")
        for i, tache in enumerate(taches, 1):
            print(f"{i}. {tache['tache']} - {tache['statut']}")

Parcourt et affiche chaque tâche avec son statut.


📌 4. Modifier le Statut d’une Tâche

def modifier_statut_tache(taches):
    """Permet de changer le statut d'une tâche."""
    afficher_taches(taches)
    try:
        index = int(input("Entrez le numéro de la tâche à modifier : ")) - 1
        if 0 <= index < len(taches):
            nouveau_statut = input("Nouveau statut (En cours / Terminée) : ")
            taches[index]["statut"] = nouveau_statut
            print("🔄 Statut mis à jour !")
        else:
            print("❌ Numéro invalide.")
    except ValueError:
        print("⚠️ Veuillez entrer un nombre valide.")

✔ Permet de modifier le statut d’une tâche en fonction de son numéro.


📌 5. Supprimer une Tâche

def supprimer_tache(taches):
    """Supprime une tâche de la liste."""
    afficher_taches(taches)
    try:
        index = int(input("Entrez le numéro de la tâche à supprimer : ")) - 1
        if 0 <= index < len(taches):
            del taches[index]
            print("🗑️ Tâche supprimée avec succès !")
        else:
            print("❌ Numéro invalide.")
    except ValueError:
        print("⚠️ Veuillez entrer un nombre valide.")

Supprime une tâche de la liste.


🔹 Étape 4 : Interface en Ligne de Commande

Nous allons regrouper ces fonctions dans une interface interactive.

def gestionnaire_taches():
    """Interface utilisateur pour la gestion des tâches."""
    taches = charger_taches()

    while True:
        print("\n🔹 Menu :")
        print("1️⃣ Ajouter une tâche")
        print("2️⃣ Afficher les tâches")
        print("3️⃣ Modifier le statut d'une tâche")
        print("4️⃣ Supprimer une tâche")
        print("5️⃣ Sauvegarder et quitter")

        choix = input("👉 Choisissez une option : ")

        if choix == "1":
            ajouter_tache(taches)
        elif choix == "2":
            afficher_taches(taches)
        elif choix == "3":
            modifier_statut_tache(taches)
        elif choix == "4":
            supprimer_tache(taches)
        elif choix == "5":
            sauvegarder_taches(taches)
            print("💾 Tâches sauvegardées. 👋 Au revoir !")
            break
        else:
            print("⚠️ Option invalide, essayez encore.")

# Lancer le programme
gestionnaire_taches()

📊 Ce que Vous Avez Appris

Lire et écrire dans un fichier JSON
Manipuler des listes et dictionnaires en Python
Créer une interface interactive avec des choix utilisateur
Structurer un programme avec des fonctions réutilisables


Améliorations Possibles

🔹 Ajouter une date d’échéance aux tâches.
🔹 Utiliser une interface graphique avec Tkinter ou PyQt.
🔹 Ajouter une option de recherche de tâches.
🔹 Envoyer des rappels par e-mail avec smtplib.


Avec ce projet, vous avez mis en pratique les bases essentielles de Python, tout en créant une application utile et modulaire. Enrichissez ce gestionnaire avec de nouvelles fonctionnalités pour monter en compétences en programmation Python.

📌 Fiche Pratique : Programmation Python – Gestionnaire de Tâches avec Stockage JSON

📖 Objectif

Créer un gestionnaire de tâches en Python permettant :
✅ D’ajouter, afficher, modifier et supprimer des tâches
✅ De sauvegarder les tâches dans un fichier JSON
✅ De créer une interface en ligne de commande interactive


📌 1. Installer et Configurer Python

📍 Vérifier l’installation de Python

python --version
📍 Créer le fichier du projet
touch gestionnaire_taches.py

📌 2. Charger et Sauvegarder les Tâches

📍 Fichier taches.json (Format de stockage)

[
    {"tache": "Acheter du lait", "statut": "En cours"},
    {"tache": "Réviser Python", "statut": "Terminée"}
]
📍 Fonctions Python
import json

FICHIER_TACHES = "taches.json"

def charger_taches():
    """Charge les tâches depuis un fichier JSON."""
    try:
        with open(FICHIER_TACHES, "r") as fichier:
            return json.load(fichier)
    except FileNotFoundError:
        return []

def sauvegarder_taches(taches):
    """Sauvegarde les tâches dans un fichier JSON."""
    with open(FICHIER_TACHES, "w") as fichier:
        json.dump(taches, fichier, indent=4)

📌 3. Ajouter une Tâche

def ajouter_tache(taches):
    """Ajoute une nouvelle tâche."""
    tache = input("Entrez la nouvelle tâche : ")
    taches.append({"tache": tache, "statut": "En cours"})
    print("✅ Tâche ajoutée !")

📌 4. Afficher les Tâches

def afficher_taches(taches):
    """Affiche toutes les tâches."""
    if not taches:
        print("📌 Aucune tâche.")
    else:
        print("\n📋 Liste des tâches :")
        for i, tache in enumerate(taches, 1):
            print(f"{i}. {tache['tache']} - {tache['statut']}")

📌 5. Modifier le Statut d’une Tâche

def modifier_statut_tache(taches):
    """Modifie le statut d'une tâche."""
    afficher_taches(taches)
    try:
        index = int(input("Numéro de la tâche à modifier : ")) - 1
        if 0 <= index < len(taches):
            nouveau_statut = input("Nouveau statut (En cours / Terminée) : ")
            taches[index]["statut"] = nouveau_statut
            print("🔄 Statut mis à jour !")
        else:
            print("❌ Numéro invalide.")
    except ValueError:
        print("⚠️ Entrez un nombre valide.")

📌 6. Supprimer une Tâche

def supprimer_tache(taches):
    """Supprime une tâche."""
    afficher_taches(taches)
    try:
        index = int(input("Numéro de la tâche à supprimer : ")) - 1
        if 0 <= index < len(taches):
            del taches[index]
            print("🗑️ Tâche supprimée !")
        else:
            print("❌ Numéro invalide.")
    except ValueError:
        print("⚠️ Entrez un nombre valide.")

📌 7. Interface en Ligne de Commande

def gestionnaire_taches():
    """Interface du gestionnaire de tâches."""
    taches = charger_taches()

    while True:
        print("\n🔹 Menu :")
        print("1️⃣ Ajouter une tâche")
        print("2️⃣ Afficher les tâches")
        print("3️⃣ Modifier une tâche")
        print("4️⃣ Supprimer une tâche")
        print("5️⃣ Sauvegarder et quitter")

        choix = input("👉 Choisissez une option : ")

        if choix == "1":
            ajouter_tache(taches)
        elif choix == "2":
            afficher_taches(taches)
        elif choix == "3":
            modifier_statut_tache(taches)
        elif choix == "4":
            supprimer_tache(taches)
        elif choix == "5":
            sauvegarder_taches(taches)
            print("💾 Tâches sauvegardées. 👋 Au revoir !")
            break
        else:
            print("⚠️ Option invalide.")

# Lancer le programme
gestionnaire_taches()

Manipuler les fichiers JSON en lecture/écriture
Créer une interface interactive avec des choix utilisateur
Structurer un programme avec des fonctions


📌 Gestion des Bugs Possibles dans le Gestionnaire de Tâches Python (Stockage JSON)

Lors de la programmation d’un gestionnaire de tâches en Python avec stockage JSON, certains bugs peuvent apparaître. Voici une liste des bugs possibles, leur cause, et la solution appropriée.


1️⃣ Erreur : Fichier JSON Introuvable

🔹 Problème

Lorsque le fichier taches.json n’existe pas, une erreur FileNotFoundError peut survenir.

FileNotFoundError: [Errno 2] No such file or directory: 'taches.json'

✅ Solution

✔ Vérifier si le fichier existe avant d’essayer de le lire.
✔ Si le fichier n’existe pas, créer une liste vide au lieu de lever une erreur.

Correction dans charger_taches() :

def charger_taches():
    """Charge les tâches depuis un fichier JSON."""
    try:
        with open("taches.json", "r") as fichier:
            return json.load(fichier)
    except FileNotFoundError:
        return []  # Retourne une liste vide si le fichier n'existe pas

2️⃣ Erreur : Format JSON Corrompu

🔹 Problème

Si le fichier JSON contient une erreur de syntaxe (modification manuelle ou corruption), Python lève une JSONDecodeError.

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

✅ Solution

✔ Ajouter une gestion d’erreur pour éviter le plantage si le fichier est corrompu.
✔ Si le JSON est invalide, réinitialiser le fichier.

Correction :

def charger_taches():
    """Charge les tâches et gère les erreurs JSON."""
    try:
        with open("taches.json", "r") as fichier:
            return json.load(fichier)
    except (FileNotFoundError, json.decoder.JSONDecodeError):
        return []  # Retourne une liste vide si erreur

3️⃣ Bug : Mauvaise Saisie de Numéro de Tâche

🔹 Problème

Si l’utilisateur entre un numéro invalide (hors de la liste) pour modifier ou supprimer une tâche, une erreur se produit :

IndexError: list index out of range

✅ Solution

✔ Vérifier si l’index entré est bien compris dans la liste.
✔ Si l’utilisateur saisit un index invalide, afficher un message d’erreur.

Correction dans supprimer_tache() et modifier_statut_tache() :

def supprimer_tache(taches):
    """Supprime une tâche de la liste en vérifiant l'entrée utilisateur."""
    afficher_taches(taches)
    try:
        index = int(input("Entrez le numéro de la tâche à supprimer : ")) - 1
        if 0 <= index < len(taches):
            del taches[index]
            print("🗑️ Tâche supprimée avec succès !")
        else:
            print("❌ Numéro invalide.")
    except ValueError:
        print("⚠️ Veuillez entrer un nombre valide.")

4️⃣ Bug : Fermeture Inattendue sans Sauvegarde

🔹 Problème

Si le programme se ferme brusquement, les tâches ajoutées ne sont pas enregistrées dans le fichier JSON.

✅ Solution

✔ Ajouter une option de sauvegarde automatique après chaque modification.
✔ Sauvegarder les tâches après ajout, modification ou suppression.

Correction :

def ajouter_tache(taches):
    """Ajoute une tâche et sauvegarde immédiatement."""
    tache = input("Entrez la nouvelle tâche : ")
    taches.append({"tache": tache, "statut": "En cours"})
    sauvegarder_taches(taches)  # Sauvegarde automatique
    print("✅ Tâche ajoutée et sauvegardée !")

5️⃣ Bug : Erreur de Saisie Utilisateur

🔹 Problème

Si l’utilisateur entre un texte au lieu d’un nombre pour choisir une option du menu, Python affiche :

ValueError: invalid literal for int() with base 10

✅ Solution

✔ Vérifier si l’entrée est un nombre avant de continuer.
✔ Utiliser try-except pour éviter l’erreur.

Correction dans gestionnaire_taches() :

def gestionnaire_taches():
    """Interface interactive robuste avec gestion des erreurs."""
    taches = charger_taches()

    while True:
        print("\n🔹 Menu :")
        print("1️⃣ Ajouter une tâche")
        print("2️⃣ Afficher les tâches")
        print("3️⃣ Modifier une tâche")
        print("4️⃣ Supprimer une tâche")
        print("5️⃣ Sauvegarder et quitter")

        choix = input("👉 Choisissez une option : ")

        if choix == "1":
            ajouter_tache(taches)
        elif choix == "2":
            afficher_taches(taches)
        elif choix == "3":
            modifier_statut_tache(taches)
        elif choix == "4":
            supprimer_tache(taches)
        elif choix == "5":
            sauvegarder_taches(taches)
            print("💾 Tâches sauvegardées. 👋 Au revoir !")
            break
        else:
            print("⚠️ Option invalide, veuillez entrer un chiffre entre 1 et 5.")

6️⃣ Bug : Problème de Concurrence d’Accès au Fichier

🔹 Problème

Si deux programmes Python (ou un script + un éditeur) accèdent simultanément au fichier taches.json, une corruption peut survenir.

✅ Solution

✔ Utiliser un verrouillage de fichier (with open(...) as f:) pour empêcher plusieurs écritures simultanées.

Correction :

import threading

lock = threading.Lock()

def sauvegarder_taches(taches):
    """Empêche la corruption du fichier en utilisant un verrou."""
    with lock:
        with open("taches.json", "w") as fichier:
            json.dump(taches, fichier, indent=4)

📌 Récapitulatif des Bugs et Solutions

🛠️ Bug🔍 ProblèmeSolution
Fichier JSON IntrouvableFileNotFoundErrorRetourner une liste vide si le fichier n’existe pas
Format JSON CorrompuJSONDecodeErrorGérer l’erreur et réinitialiser les tâches
Numéro de tâche invalideIndexErrorVérifier si l’index est dans la liste
Fermeture sans sauvegardePerte de donnéesSauvegarde automatique après chaque modification
Erreur de saisie utilisateurValueErrorVérifier si l’entrée est un nombre valide
Concurrence d’accès au fichierCorruption du fichier JSONUtiliser un verrou (threading.Lock())

Autres articles

Guide Pratique de Programmation en Python
Cet article explore un guide complet en programmation python et...
Read more
Série d'Exercices de Programmation python avec un...
Voici une série d'exercices de programmation en Python, classés par...
Read more
Exemples Corrigés QCM Python - Concatenation de...
Voici une série de questions à choix multiples (QCM) portant...
Read more
Maîtriser l'utilisation de la méthode join en...
La méthode join en Python est un outil puissant pour...
Read more
Comment Gérer Efficacement le Budget Mariage avec...
Télécharger un modèle Excel automatisé de budget mariage automatisé avec...
Read more
Manipulation des Tableaux en Python avec Numpy
Numpy est une bibliothèque puissante et efficace pour la manipulation...
Read more
AZ

Share
Published by
AZ

Recent Posts

Présentation d’Entreprise : Définition, Élaboration et Stratégies pour un Impact Optimal

Télécharger un canevas Word Présentation d’Entreprise ⬇︎ 1. Définition : Qu’est-ce qu’une Présentation d’Entreprise ?…

3 heures ago

Dossier Professionnel : Définition, Rôle et Structure selon les Formats

Le dossier professionnel est un document essentiel pour structurer et valoriser un parcours professionnel. Il…

3 heures ago

Rédaction d’une Présentation de Dossier : Canevas Word

Une présentation de dossier est un document structuré qui permet d’exposer de manière claire et…

4 heures ago

Exercices sur la Syntaxe : Coordination, Subordination, Juxtaposition, Inversion Sujet-Verbe, Mise en Relief (c’est… qui/que) – Avec Corrigés

Maîtriser la Syntaxe en Français La syntaxe est l'un des piliers fondamentaux de la langue…

5 heures ago

Modèle de Proposition de Valeur : Définition et Guide de Rédaction

Dans le marché compétitif d'aujourd'hui, une proposition de valeur pertinente est primordiale pour distinguer une…

5 heures ago

Modèle Word Structuré de Présentation des Propositions d’Amendements

Lors de l’élaboration ou de la révision d’un texte législatif, réglementaire ou statutaire, les propositions…

6 heures ago