
Gérer les erreurs d'ouverture/fermeture de fichier
Apprenez à gérer les erreurs qui peuvent survenir lors de l'ouverture ou de la fermeture de fichiers en Python, telles que FileNotFoundError et PermissionError. Utilisez try...except...finally et l'instruction with pour un code robuste.
Exceptions courantes lors de l'ouverture de fichiers
Plusieurs exceptions peuvent être levées lors de l'ouverture d'un fichier :
- `FileNotFoundError` : Le fichier spécifié n'existe pas, ou le chemin d'accès est incorrect. C'est l'erreur la plus courante.
- `PermissionError` : Vous n'avez pas les droits nécessaires pour ouvrir le fichier (par exemple, vous essayez d'ouvrir en écriture un fichier en lecture seule, ou vous n'avez pas les permissions de lecture/écriture sur le répertoire).
- `IsADirectoryError` : Vous essayez d'ouvrir un répertoire comme si c'était un fichier.
- `OSError` : Une erreur plus générale liée au système d'exploitation (par exemple, disque plein, nom de fichier invalide, etc.). `FileNotFoundError`, `PermissionError` et `IsADirectoryError` sont des sous-classes de `OSError`.
Il est important de gérer ces exceptions pour éviter que votre programme ne se bloque.
Gérer FileNotFoundError : le fichier n'existe pas
L'exception `FileNotFoundError` est levée lorsque vous essayez d'ouvrir un fichier en lecture (`'r'`, `'rb'`, `'r+'`, etc.) et que le fichier n'existe pas, ou que le chemin d'accès spécifié est incorrect.
Exemple (sans gestion d'erreur, le programme planterait) :
# fichier = open("fichier_inexistant.txt", "r") # Lèverait une FileNotFoundErrorExemple (avec gestion d'erreur) :
try:
fichier = open("fichier_inexistant.txt", "r", encoding="utf-8")
contenu = fichier.read()
print(contenu)
except FileNotFoundError:
print("Erreur : Le fichier spécifié n'existe pas.")
finally:
if 'fichier' in locals() and fichier:
fichier.close()Dans cet exemple, le bloc `except FileNotFoundError` capture l'exception si le fichier n'existe pas, et affiche un message d'erreur.
Notez l'utilisation de `finally` pour s'assurer de la fermeture du fichier s'il a été ouvert avec succès. La condition `if 'fichier' in locals() and fichier:` vérifie d'abord si la variable `fichier` a été initialisée dans le bloc try, puis que la variable `fichier` n'est pas à la valeur `None`.
Gérer PermissionError : problèmes de droits d'accès
L'exception `PermissionError` est levée lorsque vous n'avez pas les droits nécessaires pour effectuer une opération sur un fichier (lecture, écriture, exécution). Cela peut se produire si :
- Vous essayez d'ouvrir en écriture un fichier qui est en lecture seule.
- Vous essayez d'ouvrir un fichier dans un répertoire pour lequel vous n'avez pas les droits d'accès.
- Vous essayez d'exécuter un fichier qui n'a pas le droit d'exécution.
Exemple :
try:
# Tentative d'ouverture en écriture d'un fichier en lecture seule (ou dans un répertoire protégé)
with open("/chemin/protege/fichier.txt", "w") as f:
f.write("test")
except PermissionError:
print("Erreur : Vous n'avez pas les droits nécessaires pour écrire dans ce fichier.")La gestion de `PermissionError` peut être délicate, car elle dépend du système d'exploitation et des permissions spécifiques du fichier ou du répertoire. En général, vous pouvez afficher un message d'erreur informatif à l'utilisateur, ou essayer d'ouvrir le fichier avec des droits différents (si c'est possible).
Gérer les erreurs lors de la fermeture du fichier
Bien que moins courantes, des erreurs peuvent également se produire lors de la *fermeture* d'un fichier (par exemple, si le disque est plein et que des données en attente d'écriture ne peuvent pas être écrites).
Si vous utilisez l'instruction `with`, ces erreurs seront gérées automatiquement (l'exception sera propagée après la fermeture du fichier).
Si vous utilisez `close()` manuellement, vous devriez idéalement l'entourer d'un bloc `try...except` :
fichier = open("mon_fichier.txt", "w")
try:
fichier.write("Quelques données...")
finally:
try:
fichier.close()
except Exception as e:
print(f'Erreur à la fermeture : {e}')Cependant, dans la pratique, il est rare de gérer explicitement les erreurs lors de la fermeture du fichier *en dehors* d'un bloc `with`. L'instruction `with` est la méthode recommandée pour gérer les fichiers, et elle gère déjà ces erreurs de manière appropriée.
L'instruction with : la solution recommandée
Comme mentionné précédemment, l'instruction `with` est la solution recommandée pour gérer l'ouverture et la fermeture des fichiers en Python. Elle garantit que le fichier sera fermé, même en cas d'exception, et elle simplifie le code.
Lorsque vous utilisez `with`, vous n'avez pas besoin de vous soucier explicitement de la gestion des erreurs lors de la fermeture du fichier. Si une erreur se produit lors de la fermeture, elle sera propagée après que le fichier ait été fermé.
Exemple :
try:
with open("fichier_inexistant.txt", "r", encoding="utf-8") as fichier:
contenu = fichier.read()
except FileNotFoundError:
print("Erreur : Le fichier n'existe pas.")
# Le fichier est fermé, quoi qu'il arriveDans cet exemple, même si `FileNotFoundError` est levée, le fichier est garanti d'être fermé *avant* que l'exception ne soit gérée par le bloc `except`.
En résumé : utilisez toujours `with` pour ouvrir et fermer les fichiers en Python. C'est plus sûr, plus concis et plus lisible.