Le chat d'octets

Photo de Gribouille

Manipuler des fichiers avec le module pathlib

Présentation de Pathlib

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.

Création et manipulation de chemin avec Path

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()

Gestions des chemins

Concaténation des chemins

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

Résolution des chemins

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)        

Principales méthodes et propriétés de Path

Vérification de l'existence et des types de fichiers

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

Extraction des composants d'un chemin

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

Parcourir un répertoire

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)

Création et suppression de fichiers et dossiers

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)

Lecture et écriture de fichiers

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")