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 : lemoduleos 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 :
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'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)Propulsé par
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():
<class 'pathlib.PosixPath'>
PosixPath('/Users/sg/Documents/GitHub/datacamp')Propulsé par
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 :
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)Propulsé par
/Users/sg/Documents/GitHub/datacamp/testing_osPropulsé par
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 :
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))Propulsé par
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")withopen(output_file,"w")asfile:file.write("Testing path modification with the 'os' module")Propulsé par
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)Propulsé par
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))Propulsé par
/Users/sg/Documents/GitHub/datacamp/testing_pathlib
FalsePropulsé par
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))Propulsé par
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 :
withopen(output_path /"test.txt","w")asfile:file.write("Testing path modification with the 'pathlib' module")Propulsé par
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)Propulsé par
/Users/sg/Documents/GitHub/datacamp/testing_pathlib/test.txtPropulsé par
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)Propulsé par
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) :
<generator object Path.iterdir at 0x1036b2c20>Propulsé par
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)Propulsé par
/Users/sg/Documents/GitHub/datacamp
/Users/sg/Documents/GitHubPropulsé par
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 :
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 :
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.
Tutoriel complet d'introduction aux boucles Python. Apprenez et pratiquez les boucles while et for, les boucles imbriquées, les mots-clés break et continue, la fonction range et bien plus encore.
Découvrez les classes abstraites Python, leur utilité et comment utiliser le module `abc` pour garantir la cohérence des interfaces. Comprend des exemples pratiques et des bonnes pratiques pour une mise en œuvre efficace.
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
oset le modulepathlib.Le module
osoffre 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.pathlibest 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
osetpathlibet comparons les deux solutions.L'utilisation
os.getcwd()Le module
ospermet d'accéder au système d'exploitation de l'ordinateur. La fonctiongetcwd()permet de récupérer le répertoire de travail actuel :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 :
La valeur renvoyée par
os.getcwd()est une chaîne de caractères: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 depathlibestPath, que nous pouvons importer avant d'obtenir le répertoire de travail actuel :La sortie imprimée de
Path.cwd()ressemble à la valeur renvoyée paros.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 derepr():Sur un ordinateur Windows,
Path.cwd()renvoie un objetWindowsPath.Les objets
PosixPathetWindowsPathoffrent des fonctionnalités similaires pour permettre la réalisation de programmes multiplateformes. Voici quelques-uns des attributs de ces objets :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
osmoduleLa fonction
getcwd()du moduleosrenvoie 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 à utiliseros.path.join():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 avecos.path.exists(), qui renvoie une valeur booléenne :Cela montre que le chemin représenté par
output_pathn'existe pas encore. Le moduleosfournit des outils pour créer ce dossier. La fonctionos.mkdir()crée un nouveau répertoire :Le nouveau sous-dossier existe désormais et de nouveaux fichiers peuvent être enregistrés dans ce dossier :
La variable
output_filecontient le nom du fichier de sortie souhaité avec le chemin d'accès complet. Ce fichier texte est créé dans le sous-dossier/testing_osdu répertoire de travail actuel.Nous pouvons également dresser la liste de tous les éléments d'un dossier à l'aide de
os.listdir():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
pathlibmoduleLe 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à :La classe
Pathpossède sa propre méthode.mkdir()pour créer un nouveau répertoire :Comme
output_pathest un objetPosixPathouWindowsPath, nous pouvons utiliser l'opérateur de barre oblique n'importe où pour créer un nouveau chemin :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 :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 objetPosixPathouWindowsPath. Nous pouvons utiliser l'attribut.namepour afficher le nom du fichier ou du dossier sans le chemin d'accès complet :Alors que
os.listdir()renvoie une liste,pathlib.Path.iterdir()renvoie un objetgenerator(vous pouvez lire ce tutoriel sur les Les itérateurs et générateurs Python si vous avez besoin d'un rappel) :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 danspathlib. Cependant, nous pouvons toujours utiliser des objetspathlib.Pathcomme arguments :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 dansos.chdir()peut également être une chaîne de caractères, comme les chemins renvoyés par les fonctions du moduleos.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 :
Conclusion
La navigation et la manipulation des chemins d'accès aux fichiers est une exigence courante dans de nombreux programmes Python. Le module
osfournit les fonctions traditionnelles pour traiter ces tâches, tandis que le modulepathliboffre une approche plus moderne, orientée vers les objets. L'utilisation depathlibsimplifie 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
osou que vous commenciez un nouveau projet dans lequel vous pouvez tirer parti depathlib, 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 :