1.5 Projet : Le Safe Opener

Appliquons notre savoir pour créer une lecture de fichier robuste.

1. Pathlib : L'approche moderne

On utilise Pathlib pour manipuler les fichiers comme des objets.

2. Gestion d'erreurs : Le bloc complet

Pour ĂȘtre ""Fail Fast", nous utilisons try / except / else / finally.

import pathlib
import logging

def load_scan_file(file_path: str) -> str:
    """Ouvre un fichier et renvoie son contenu ou une chaĂźne vide."""
    try:
        path = pathlib.Path(file_path)
        return path.read_text(encoding="utf-8")
    except FileNotFoundError:
        logging.error("Fichier introuvable.")
        return ""
    except Exception as e:
        logging.error(f"Erreur inattendue : {e}")
        return ""
    finally:
        # Toujours exécuté (utile pour fermer des ressources complexes)
        pass

def main():
    print("--- pyCycloneFlow : Safe Opener ---")

    # 1. On charge le fichier
    raw_content = load_scan_file("scanner.txt")

    print(raw_content)

if __name__ == "__main__":
    main()
Résultat attendu :
--- pyCycloneFlow : Safe Opener ---
ERROR:root:Fichier introuvable.

Projet Fil Rouge : Votre premier Test

Créez tests/test_opener.py et validez votre code :

import unittest
from main import load_scan_file

class TestOpener(unittest.TestCase):
    def test_file_not_found(self):
        # Utilisation de la notation pointée recommandée
        result = load_scan_file("inconnu.txt")
        self.assertEqual(result, "")

if __name__ == "__main__":
    unittest.main()

Lancer le test dans votre environnement (venv): python -m unittest tests.test_opener (sansle .py)

Résultat attendu :
ERROR:root:Fichier introuvable.
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Chapitre précédent Phase 2 : Algorithmique