cours
Comment obtenir le répertoire courant en Python
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 :
- Cache Python : Deux méthodes simples
- Python timedelta : Travailler avec des intervalles de temps en Python
- Comment convertir une chaîne de caractères en octets en Python
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 :
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.
Apprenez Python avec ces cours !
cours
Boîte à outils Python
cours