Accéder au contenu principal

Comment obtenir le répertoire courant en Python

Pour obtenir le répertoire de travail actuel en Python, vous pouvez utiliser soit os.getcwd() du module os, soit pathlib.Path.cwd() du module pathlib.
Actualisé 14 nov. 2024

De nombreux programmes Python doivent naviguer dans le système de fichiers pour lire et écrire des fichiers. Une opération courante consiste à récupérer le répertoire de travail actuel, souvent abrégé en CWD.

Python dispose de deux modules principaux qui peuvent être utilisés pour accéder aux chemins du système de fichiers : lemodule os et le module pathlib .

Le module os offre l'approche traditionnelle pour obtenir le répertoire de travail actuel et travaille avec les chemins d'accès et le système de fichiers.

pathlib est un module plus récent qui offre une approche orientée objet, robuste et multiplateforme.

Dans ce tutoriel, j'explore les différentes techniques pour récupérer et manipuler le répertoire de travail actuel. Si vous souhaitez en savoir plus sur Python, n'hésitez pas à explorer certains de mes autres articles de blog :

Python : Comment obtenir le répertoire de travail actuel (CWD) ?

Le répertoire de travail actuel est le répertoire dans lequel un programme Python est exécuté. Il sert de point de référence pour les chemins d'accès relatifs aux fichiers et permet au programme d'accéder aux fichiers et aux ressources dans la hiérarchie des répertoires.

Voyons comment accéder au répertoire de travail actuel à l'aide des modules os et pathlib et comparons les deux solutions.

L'utilisation os.getcwd()

Le module os permet d'accéder au système d'exploitation de l'ordinateur. La fonction getcwd() permet de récupérer le répertoire de travail actuel :

import os
cwd = os.getcwd()
print(cwd)
/Users/sg/Documents/GitHub/datacamp

La sortie indique le chemin du répertoire contenant le script. Le format du chemin dépend du système d'exploitation. La sortie ci-dessus concerne les systèmes d'exploitation POSIX tels que Linux, Unix et macOS.

Le même chemin d'accès sur un système Windows s'afficherait comme suit :

C:\Users\sg\Documents\GitHub\datacamp

La valeur renvoyée par os.getcwd() est une chaîne de caractères:

print(type(cwd))
<class 'str'>

C'est pourquoi nous devons utiliser des méthodes de chaînes de caractères et d'autres opérations sur les chaînes de caractères pour traiter ce chemin.

L'utilisation pathlib.Path.cwd()

Python 3.4 a introduit le module pathlib, qui offre une approche orientée objet pour accéder aux chemins d'accès aux fichiers et les manipuler. La classe principale de pathlib est Path, que nous pouvons importer avant d'obtenir le répertoire de travail actuel :

from pathlib import Path
cwd = Path.cwd()
print(cwd)
/Users/sg/Documents/GitHub/datacamp

La sortie imprimée de Path.cwd() ressemble à la valeur renvoyée par os.getcwd(). Cependant, Path.cwd() ne renvoie pas de chaîne de caractères. Nous pouvons le confirmer en imprimant le type de l'objet renvoyé ou en affichant sa représentation officielle sous forme de chaîne de caractères à l'aide de repr():

print(type(cwd))
print(repr(cwd))
<class 'pathlib.PosixPath'>
PosixPath('/Users/sg/Documents/GitHub/datacamp')

Sur un ordinateur Windows, Path.cwd() renvoie un objet WindowsPath.

Les objets PosixPath et WindowsPath offrent des fonctionnalités similaires pour permettre la réalisation de programmes multiplateformes. Voici quelques-uns des attributs de ces objets :

print(cwd.parent)
print(cwd.name)
/Users/sg/Documents/GitHub
datacamp

Dans la mesure du possible, il est préférable d'utiliser le module pathlib, qui est plus moderne et facilite la gestion des chemins. Vous pouvez lire ce guide complet sur l'utilisation de pathlib en Python si vous souhaitez en savoir plus.

Travailler avec le répertoire courant

Les programmes Python ont souvent besoin de manipuler le chemin d'accès, par exemple pour enregistrer un fichier dans un sous-dossier. Supposons que nous devions créer un nouveau sous-répertoire dans notre répertoire de travail actuel et enregistrer un fichier texte dans ce nouveau dossier.

L'utilisation de la os module

La fonction getcwd() du module os renvoie une chaîne de caractères. Il est donc possible de modifier manuellement cette chaîne pour modifier le chemin. Toutefois, les modifications nécessaires varient en fonction du système d'exploitation, car les formats de chemin d'accès varient d'un système à l'autre. Une meilleure option consiste à utiliser os.path.join():

import os
cwd = os.getcwd()
output_path = os.path.join(cwd, "testing_os")
print(output_path)
/Users/sg/Documents/GitHub/datacamp/testing_os

Le chemin d'accès renvoyé par os.path.join() est au format correct pour le système d'exploitation utilisé. Il renvoie une chaîne de caractères contenant le nouveau chemin d'accès. Nous pouvons vérifier si ce sous-dossier existe avec os.path.exists(), qui renvoie une valeur booléenne :

print(os.path.exists(output_path))
False

Cela montre que le chemin représenté par output_path n'existe pas encore. Le module os fournit des outils pour créer ce dossier. La fonction os.mkdir() crée un nouveau répertoire :

os.mkdir(output_path)
print(os.path.exists(output_path))
True

Le nouveau sous-dossier existe désormais et de nouveaux fichiers peuvent être enregistrés dans ce dossier :

output_file = os.path.join(output_path, "test.txt")
with open(output_file, "w") as file:
    file.write("Testing path modification with the 'os' module")

La variable output_file contient le nom du fichier de sortie souhaité avec le chemin d'accès complet. Ce fichier texte est créé dans le sous-dossier /testing_os du répertoire de travail actuel.

Nous pouvons également dresser la liste de tous les éléments d'un dossier à l'aide de os.listdir():

for item in os.listdir(output_path):
    print(item)
test.txt

La fonction os.listdir() renvoie une liste contenant tous les éléments du répertoire. Ce code parcourt cette liste pour afficher chaque fichier ou dossier sur une ligne distincte. Dans cet exemple, le répertoire contient un seul fichier texte.

L'utilisation de la pathlib module

Le module pathlib, plus récent, fournit également des outils permettant de créer de nouveaux chemins. Ce module utilise l'opérateur de barre oblique / pour combiner des éléments dans un chemin d'accès. Il s'agit du même opérateur que celui utilisé pour la division des types de données numériques, mais c'est également le caractère utilisé dans les chemins d'accès aux fichiers dans les systèmes d'exploitation POSIX. Créons un nouveau chemin et vérifions qu'il n'existe pas déjà :

from pathlib import Path
cwd = Path.cwd()
output_path = cwd / "testing_pathlib"
print(output_path)
print(Path.exists(output_path))
/Users/sg/Documents/GitHub/datacamp/testing_pathlib
False

La classe Path possède sa propre méthode .mkdir() pour créer un nouveau répertoire :

Path.mkdir(output_path)
print(Path.exists(output_path))
True

Comme output_path est un objet PosixPath ou WindowsPath, nous pouvons utiliser l'opérateur de barre oblique n'importe où pour créer un nouveau chemin :

with open(output_path / "test.txt", "w") as file:
    file.write("Testing path modification with the 'pathlib' module")

Le nouveau fichier texte est créé dans le dossier /testing_pathlib.

Nous pouvons utiliser la méthode Path .iterdir() pour parcourir chaque élément d'un dossier :

for item in Path.iterdir(output_path):
    print(item)
/Users/sg/Documents/GitHub/datacamp/testing_pathlib/test.txt

Comme pour les autres outils de pathlib, la valeur renvoyée n'est pas une chaîne de caractères. Il s'agit plutôt d'un objet PosixPath ou WindowsPath. Nous pouvons utiliser l'attribut .name pour afficher le nom du fichier ou du dossier sans le chemin d'accès complet :

for item in Path.iterdir(output_path):
    print(item.name)
test.txt

Alors que os.listdir() renvoie une liste, pathlib.Path.iterdir() renvoie un objet generator (vous pouvez lire ce tutoriel sur les Les itérateurs et générateurs Python si vous avez besoin d'un rappel) :

print(Path.iterdir(cwd))
<generator object Path.iterdir at 0x1036b2c20>

Ce comportement suit les meilleures pratiques de Python moderne puisque les itérateurs et les générateurs sont plus efficaces dans certaines situations.

Modifier le répertoire de travail actuel (CWD)

Il est également possible de changer le répertoire de travail courant directement à partir d'un programme Python en utilisant os.chdir(). Comme il ne s'agit pas d'une opération directement liée au chemin, il n'existe pas de version alternative dans pathlib. Cependant, nous pouvons toujours utiliser des objets pathlib.Path comme arguments :

import os
from pathlib import Path
cwd = Path.cwd()
print(cwd)

os.chdir(cwd.parent)
cwd = Path.cwd()
print(cwd)
/Users/sg/Documents/GitHub/datacamp
/Users/sg/Documents/GitHub

Le répertoire de travail a changé. Nous pouvons également utiliser cwd.parent.resolve() pour nous assurer que les liens symboliques sont traités correctement. L'argument dans os.chdir() peut également être une chaîne de caractères, comme les chemins renvoyés par les fonctions du module os.

Il convient d'être prudent lorsque l'on modifie le répertoire de travail d'un programme afin de s'assurer qu'il n'y a pas de comportements inattendus.

Meilleures pratiques et conseils

Voici quelques bonnes pratiques et conseils lorsque vous travaillez avec des chemins en Python :

Meilleures pratiques pour travailler avec des chemins en Python

Conclusion

La navigation et la manipulation des chemins d'accès aux fichiers est une exigence courante dans de nombreux programmes Python. Le module os fournit les fonctions traditionnelles pour traiter ces tâches, tandis que le module pathlib offre une approche plus moderne, orientée vers les objets. L'utilisation de pathlib simplifie non seulement de nombreuses opérations, mais garantit également que votre code reste multiplateforme et plus facile à lire.

Que vous mainteniez une base de code existante qui utilise os ou que vous commenciez un nouveau projet dans lequel vous pouvez tirer parti de pathlib, la compréhension de ces deux modules et de leurs capacités vous donnera la flexibilité et la confiance nécessaires pour gérer les chemins dans n'importe quel projet Python.

Vous pouvez poursuivre votre parcours d'apprentissage de Python grâce à ces cours :


Photo of Stephen Gruppetta
Author
Stephen Gruppetta
LinkedIn
Twitter

J'ai étudié la physique et les mathématiques au niveau UG à l'université de Malte. J'ai ensuite déménagé à Londres et obtenu un doctorat en physique à l'Imperial College. J'ai travaillé sur de nouvelles techniques optiques pour obtenir des images de la rétine humaine. Aujourd'hui, je me concentre sur l'écriture, la communication et l'enseignement de Python.

Sujets

Apprenez Python avec ces cours !

Certification disponible

cours

Introduction à Python pour les développeurs

3 hr
8.6K
Maîtrisez les fondamentaux de la programmation en Python. Aucune connaissance préalable n'est requise !
Afficher les détailsRight Arrow
Commencer Le Cours
Voir plusRight Arrow