Je suis prêt à parier que vous avez déjà été amené à manipuler des fichiers avec Python. Et surtout, je pense que vous vous êtes déjà demandé : quelle différence entre os et pathlib ? De toute façon, si vous êtes arrivés sur cet article, c'est que vous vous posez la question 🙋.
Pendant longtemps, la bibliothèque os avait le monopole sur le sujet. Cependant, depuis Python 3.4, pathlib a fait son apparition.
Le module os
L'approche du module os est dite procédurale ; c'est-à-dire que l'on appelle successivement des fonctions auxquelles on passe des chaînes de caractères.
Prenons l'exemple avec os.path.join pour construire le chemin vers config.json dans un dossier data :
import os # Construction du chemin dossier = "data" fichier = "config.json" chemin_complet = os.path.join(dossier, fichier) print(chemin_complet) # data\config.json
Le chemin n'est rien d'autre qu'une chaîne de caractères. Maintenant, remontons au dossier parent du script actuel : nous allons utiliser la variable spéciale __file__ qui contient le chemin du script actuel (il s'agit d'une chaîne de caractères).
Si nous voulons remonter au dossier parent du script, vous allez vite vous retrouver à empiler les fonctions les unes sur les autres :
parent_dir = os.path.dirname(os.path.abspath(__file__))
Tandis qu'abspath s'occupe de la conversion en chemin absolu, dirname récupère le répertoire parent.
Le module pathlib
Le module pathlib propose une approche différente : un chemin n'est pas une simple chaîne de caractères, c'est un objet. Ce qui change tout, car il est maintenant possible d'appeler des méthodes et des attributs sur l'objet en question.
Avant de comparer directement les deux façons de faire, prenons un exemple pour concaténer des chemins :
from pathlib import Path # On crée un objet Path dossier = Path("data") fichier = "config.json" # Utilisation du slash chemin_complet = dossier / fichier print(chemin_complet) # data\config.json
Nous allons maintenant comparer les deux modules en écrivant du code pour arriver au même résultat final.
Comparatif : os vs pathlib
Rien de tel qu'un comparatif pour bien comprendre la différence entre les deux approches.
Remonter de deux dossiers parents
Avec os :
import os chemin = "script.py" parent = os.path.dirname(os.path.dirname(os.path.abspath(chemin)))
Avec pathlib :
from pathlib import Path chemin = Path("script.py") # .resolve() est l'équivalent de abspath, et on enchaîne les .parent parent = chemin.resolve().parent.parent
Lister les fichiers
Nous voulons récupérer tous les fichiers .txt d'un dossier.
Avec os :
import os fichiers_txt = [f for f in os.listdir("data") if f.endswith(".txt")]
Avec pathlib :
from pathlib import Path fichiers_txt = list(Path("data").glob("*.txt"))
Récupérer les extensions et noms de fichiers
Vous allez voir à quel point il est pratique de pouvoir passer par des attributs avec pathlib.
Avec os :
import os chemin = "images/vacances_patrick.jpg" nom_fichier = os.path.basename(chemin) nom_sans_ext, extension = os.path.splitext(nom_fichier) print(nom_sans_ext) # vacances_patrick print(extension) # .jpg
Avec pathlib :
from pathlib import Path image = Path("images/vacances_patrick.jpg") # C'est natif via des attributs print(image.stem) # vacances_patrick print(image.suffix) # .jpg
Accéder au dossier utilisateur
Avec os :
import os # Il faut utiliser une fonction spécifique home = os.path.expanduser("~")
Avec pathlib :
from pathlib import Path chemin_config = Path.home()
Même si aujourd'hui on a tendance à utiliser pathlib, vous retrouverez os dans certains programmes déjà existants.
Prenez par exemple Django et Wagtail.
Si vous regardez le fichier settings.py de Django :
from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent
Et le fichier base.py du package settings de Wagtail :
import os PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) BASE_DIR = os.path.dirname(PROJECT_DIR)
os est loin d'être mort, vous pouvez donc le retrouver assez facilement. C'est pour cette raison qu'il est toujours bien de le connaître.