
Créer, renommer et supprimer des fichiers et répertoires
Apprenez à créer, renommer et supprimer des fichiers et des répertoires en Python en utilisant les fonctions du module 'os' (mkdir, makedirs, rename, remove, rmdir, removedirs). Gérez les exceptions et les cas particuliers.
Créer des répertoires : os.mkdir() et os.makedirs()
Pour créer un répertoire (un dossier) en Python, vous pouvez utiliser les fonctions `os.mkdir()` et `os.makedirs()` du module `os`.
- `os.mkdir(path)` : Crée un *seul* répertoire. Le répertoire parent doit déjà exister. Si le répertoire existe déjà, une exception `FileExistsError` est levée.
- `os.makedirs(path)` : Crée un répertoire et tous les répertoires parents intermédiaires nécessaires. Par exemple, si vous appelez `os.makedirs('a/b/c')` et que ni `a`, ni `a/b`, ni `a/b/c` n'existent, ils seront tous créés. Si le répertoire final existe déjà, par défaut, `FileExistsError` est levée (sauf si `exist_ok=True`, voir plus loin).
Syntaxe :
import os
os.mkdir(chemin)
os.makedirs(chemin, exist_ok=False) # exist_ok est un argument optionnelExemples :
import os
# Créer un répertoire simple (le répertoire parent doit exister)
# os.mkdir("nouveau_repertoire")
# Créer une arborescence de répertoires
# os.makedirs("repertoire1/repertoire2/repertoire3")
# Créer un répertoire, même s'il existe déjà (sans erreur)
# os.makedirs("repertoire_existant", exist_ok=True)L'argument `exist_ok=True` (disponible depuis Python 3.2) permet à `os.makedirs` de ne pas lever d'exception si le répertoire cible existe déjà. C'est utile pour éviter une condition de concurrence (race condition) si plusieurs processus essaient de créer le même répertoire en même temps.
Il est recommandé d'utiliser des blocs `try...except` pour gérer les erreurs potentielles (par exemple, si vous n'avez pas les droits nécessaires pour créer un répertoire) :
import os
try:
os.makedirs("mon_repertoire/sous_repertoire", exist_ok=True)
except OSError as e:
print(f"Erreur lors de la création du répertoire : {e}")Renommer des fichiers et des répertoires : os.rename()
La fonction `os.rename()` permet de renommer un fichier ou un répertoire.
Syntaxe :
import os
os.rename(ancien_chemin, nouveau_chemin)- `ancien_chemin` : Le chemin actuel du fichier ou du répertoire.
- `nouveau_chemin` : Le nouveau chemin du fichier ou du répertoire.
Si `nouveau_chemin` existe déjà, le comportement dépend du système d'exploitation. Sur certains systèmes, une exception sera levée. Sur d'autres, le fichier/répertoire existant sera remplacé (attention !).
Exemple :
import os
# Renommer un fichier
# os.rename("ancien_nom.txt", "nouveau_nom.txt")
# Renommer un répertoire
# os.rename("ancien_repertoire", "nouveau_repertoire")Utilisez `try...except` pour gérer les erreurs potentielles (`FileNotFoundError`, `PermissionError`, etc.).
Supprimer des fichiers : os.remove()
La fonction `os.remove()` (ou son alias `os.unlink()`) permet de supprimer un fichier.
Syntaxe :
import os
os.remove(chemin)- `chemin` : Le chemin du fichier à supprimer.
Si le chemin spécifié est un répertoire, une `IsADirectoryError` sera levée. Si le fichier n'existe pas, une `FileNotFoundError` sera levée.
Exemple :
import os
# Supprimer un fichier
# os.remove("fichier_a_supprimer.txt")Utilisez `try...except` pour gérer les erreurs potentielles.
Supprimer des répertoires : os.rmdir() et os.removedirs()
Pour supprimer des répertoires, vous pouvez utiliser `os.rmdir()` et `os.removedirs()`.
- `os.rmdir(path)` : Supprime un répertoire *vide*. Si le répertoire n'est pas vide, une `OSError` (ou `FileNotFoundError` s'il n'existe pas) sera levée.
- `os.removedirs(path)` : Supprime un répertoire et tous ses répertoires parents *vides*. Par exemple, `os.removedirs('a/b/c')` supprimera `c`, puis `b` (si `c` était le seul élément dans `b`), puis `a` (si `b` était le seul élément dans `a`). S'arrête dès qu'il rencontre un répertoire non vide, ou un répertoire pour lequel il n'a pas les permissions.
Exemple :
import os
# Supprimer un répertoire vide
# os.rmdir("repertoire_vide")
# Supprimer une arborescence de répertoires vides
# os.removedirs("repertoire1/repertoire2/repertoire3") # Supprime repertoire3, puis repertoire2, puis repertoire1 (s'ils sont vides)Utilisez `try...except` pour gérer les erreurs potentielles.
**Attention :** `os.rmdir()` et `os.removedirs()` ne suppriment que les répertoires *vides*. Si vous voulez supprimer un répertoire qui contient des fichiers ou des sous-répertoires (non vides), vous devez utiliser une autre approche, comme `shutil.rmtree()` (voir section suivante). Soyez *très prudent* avec ces fonctions, car la suppression est irréversible.
Supprimer des arborescences de répertoires : shutil.rmtree() (prudence !)
Le module `shutil` (Shell utilities) fournit des fonctions de haut niveau pour manipuler des fichiers et des répertoires, y compris la fonction `shutil.rmtree()` qui permet de supprimer un répertoire *et tout son contenu*, récursivement (fichiers, sous-répertoires, etc.).
**Attention :** `shutil.rmtree()` est une fonction *puissante et dangereuse*. Utilisez-la avec une extrême prudence, car la suppression est *irréversible*. Assurez-vous *absolument* de supprimer le bon répertoire !
Syntaxe :
import shutil
shutil.rmtree(chemin)- `chemin` : Le chemin du répertoire à supprimer (et tout son contenu).
Exemple :
import shutil
# Supprimer un répertoire et tout son contenu (DANGER !)
# shutil.rmtree("repertoire_a_supprimer")Il est fortement recommandé d'utiliser un bloc `try...except` pour gérer les erreurs potentielles (`FileNotFoundError`, `PermissionError`, etc.) et de *double-vérifier* le chemin avant d'appeler `shutil.rmtree()`.
Bonnes pratiques et gestion des erreurs
Lors de la manipulation de fichiers et de répertoires, il est essentiel de gérer les erreurs potentielles, telles que :
- `FileNotFoundError` : Le fichier ou le répertoire n'existe pas.
- `PermissionError` : Vous n'avez pas les droits nécessaires pour effectuer l'opération.
- `FileExistsError` : Le fichier ou le répertoire existe déjà (lors de la création avec `os.mkdir` ou `os.makedirs` sans `exist_ok=True`, ou avec le mode d'ouverture `'x'`).
- `IsADirectoryError` / `NotADirectoryError` : Vous essayez d'effectuer une opération sur un fichier alors que c'est un répertoire, ou vice-versa.
- `OSError` : Autres erreurs liées au système d'exploitation.
Utilisez des blocs `try...except...finally` pour capturer ces exceptions et les gérer de manière appropriée (afficher un message d'erreur, réessayer l'opération, etc.).
Utilisez l'instruction `with` pour ouvrir les fichiers, afin de garantir leur fermeture automatique.
Exemple (combinant plusieurs bonnes pratiques) :
import os
import shutil
def creer_et_supprimer(repertoire):
try:
os.makedirs(repertoire, exist_ok=True)
fichier_test = os.path.join(repertoire, "test.txt")
with open(fichier_test, "w", encoding = "utf-8") as f:
f.write("Ceci est un fichier de test.")
print(f"Fichier '{fichier_test}' créé avec succès.")
#Renommage du fichier:
nouveau_nom = os.path.join(repertoire, "nouveau_test.txt")
os.rename(fichier_test, nouveau_nom)
print(f"Fichier renommé en '{nouveau_nom}'.")
except OSError as e:
print(f"Erreur lors de la manipulation du répertoire/fichier : {e}")
finally:
try:
shutil.rmtree(repertoire) #Suppression du dossier et de son contenu
print(f"Répertoire '{repertoire}' supprimé.")
except OSError as e:
print(f"Erreur lors de la suppression : {e}")
creer_et_supprimer("mon_dossier_test")Dans cet exemple, on crée un répertoire, on crée un fichier à l'intérieur, on le renomme, et on supprime le tout (répertoire et fichier). Toutes les opérations sont entourées de blocs `try...except...finally` pour gérer les erreurs potentielles. L'instruction `with` est utilisée pour garantir la fermeture du fichier.