Python OS vs Pathlib

Découvrez comment moderniser la gestion de vos fichiers et gagner en lisibilité dans vos scripts Python avec Pathlib.

Publié le par Gabriel Trouvé (mis à jour le )
18 minutes

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
PYTHON

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__))
PYTHON

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
PYTHON

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

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
PYTHON

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

Avec pathlib :

from pathlib import Path
fichiers_txt = list(Path("data").glob("*.txt"))
PYTHON

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
PYTHON

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
PYTHON

Accéder au dossier utilisateur

Avec os :

import os
# Il faut utiliser une fonction spécifique
home = os.path.expanduser("~")
PYTHON

Avec pathlib :

from pathlib import Path

chemin_config = Path.home()
PYTHON

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
PYTHON

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

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.

Bravo, tu es prêt à passer à la suite

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.