La bibliothèque Pathlib fournit une interface pour manipuler les répertoires et les chemins de fichiers. Elle est disponible depuis la version 3.4 de Python et remplace progressivement os.path grâce à sa facilité d'utilisation.
La classe principale de Pathlib est Path qui permet de manipuler les chemins sans distinction entre les systèmes d'exploitation.
from pathlib import Path
# Chemin relatif
p = Path("dossier/fichier.txt")
# Chemin absolu
p = Path("/home/user/dossier/fichier.txt")
# Récupérer le chemin du répertoire utilisateur
home_path = Path.home() # /home/user
# Récupérer le répertoire courant
p = Path.cwd()
Nous allons combiner un chemin absolu et un chemin relatif avec pathlib.Path, en utilisant l'opérateur /, qui gère automatiquement les séparateurs selon le système d'exploitation.
p1 = Path("/home/user")
p2 = "Documents/fichier.txt"
chemin_complet = p1 / p2
print(chemin_complet) # /home/user/Documents/fichier.txt
Nous pouvons créer un chemin relatif pointant vers le répertoire parent du fichier.txt, puis nous utilisons resolve() pour obtenir son chemin absolu en résolvant les ...
p = Path("..") / "fichier.txt"
# Résolution des "..."
chemin_absolu = p.resolve()
print(chemin_absolu)
Nous pouvons vérifier si p existe, si c'est un fichier, un répertoire ou un lien symbolique
p = Path("fichier.txt")
print(p.exists()) # Vérifie si le fichier existe
print(p.is_file()) # Vérifie si c'est un fichier
print(p.is_dir()) # Vérifie si c'est un dossier
print(p.is_symlink()) #Vérifie si c'est un lien symbolique
Nous pouvons extraire très facilement avec pathlib le nom, le nom sans extension, l'extension, le répertoire parent et la racine du chemin donné.
p = Path("/home/user/documents/fichier.txt")
print(p.name) # fichier.txt
print(p.stem) # fichier
print(p.suffix) # .txt
print(p.parent) # /home/user/documents
print(p.anchor) # / sous Linux ou C:\ sous Windows
Ce programme liste d'abord tous les fichiers et dossiers dans un dossier donné, puis cherche tous les fichiers .txt dans ce dossier et ses sous-dossiers.
p = Path("/home/user/Documents")
# Liste les fichiers et dossiers
for file in p.iterdir():
print(file)
# Récupérer tous les fichiers .txt d'un dossier et sous-dossiers
for file in p.rglob("*.txt"):
print(file)
Dans ce programme, nous créons un nouveau dossier sans générer d'erreur s'il existe déjà. Ensuite, nous créons un fichier à l'intérieur de ce dossier. Enfin, nous supprimons d'abord le fichier créé, puis nous supprimons le dossier si celui-ci est vide.
# Créer un dossier "nouveau_dossier" dans le répertoire courant
# sans provoquer d'erreur s'il existe déjà.
p = p.cwd() / "nouveau_dossier" # création du chemin
p.mkdir(parents=True, exist_ok=True) # création réel du nouveau répertoire
# créer un fichier dans ce nouveau répertoire
p = p / "nouveau_fichier.txt"
p.touch()
# Supprimer le fichier créé précédemment
p.unlink()
p = p.parent
p.rmdir() # supprime le répertoire "nouveau_dossier" s'il est vide sinon erreur
Pour supprimer un répertoire non vide il faudra utiliser la bibliothèque shutil car pathlib ne le gère pas.
import shutil
from pathlib import Path
p = Path.home() / "dossier_a_supprimer"
shutil.rmtree(p)
Dans cet exemple, nous lisons d'abord le contenu d'un fichier texte nommé fichier.txt en utilisant l'encodage UTF-8. Ensuite, nous écrivons un nouveau texte dans ce fichier, remplaçant ainsi le contenu précédent.
p = Path("fichier.txt")
# lire le contenu du fichier
contenu = p.read_text(encoding="utf-8")
# Écrire dans le fichier (remplace l'ancien contenu du fichier)
p.write_text("Bonjour ceci est un test.", encoding="utf-8")