La bibliothèque standard de Python contient la plupart des fonctionnalités dont un développeur a besoin pour résoudre un problème. Dans ce tutoriel, vous apprendrez différentes façons de vérifier l’existence d’un fichier ou d’un répertoire en utilisant uniquement des modules intégrés.

Vérifier si un fichier ou un script se trouve au bon endroit est crucial pour tout programme CLI. Votre programme peut devenir inutile si un fichier spécifique n’est pas en place au moment de l’exécution.

Dans le tutoriel d’aujourd’hui, vous apprendrez quelques méthodes rapides pour vérifier l’existence d’un fichier ou d’un dossier en Python.

Avant de commencer

Avant d’exécuter les commandes ci-dessous, assurez-vous que Python 3 est installé sur votre système. Ouvrez votre terminal et tapez la commande suivante :

python --version
# Python 3.9.5, mon résultat

Si vous avez une version 2.x, vous devrez utiliser la commande “python3”. Consultez notre guide d’installation de Python si vous n’avez pas installé Python 3.

Nous allons utiliser des fichiers de test dans ce tutoriel, assurez-vous donc de créer les fichiers suivants :

touch testfile.txt
mkdir répertoiretest/ 
touch répertoiretest/autrefichier.txt

Les commandes ci-dessus créent un fichier avec lequel jouer, un répertoire de test et un autre fichier à l’intérieur du répertoire de test. Les fichiers peuvent être vides puisque nous n’aurons pas besoin de lire leur contenu,

Remarque : si vous utilisez Windows, configurez cette structure de fichier simple à l’aide d’un gestionnaire de fichiers graphique.

Enfin, nous utiliserons Ipython comme interpréteur de commandes Python interactif, ce qui donne une jolie interface pour travailler. Il s’agit d’une simple commodité, qui n’est donc pas strictement nécessaire.

pip install ipython

Après avoir fait cela, vous aurez accès à un magnifique shell Python en tapant simplement ipython.

Ipython interactive shell running Python 3.9

Maintenant que vous êtes prêt, plongeons dans les moyens de vérifier si un dossier ou un fichier existe en Python.

Essayer, Ouvrir, et Sauf

C’est l’option la plus simple. Si vous essayez d’ouvrir un fichier qui n’existe pas, Python lèvera une erreur FileNotFoundError.

Dans <x><x><x><x><x><x>[1]</x></x></x></x></x></x>: open('im-not-here.txt')
---------------------------------------------------------------------------
FileNotFoundError : [Errno 2] Aucun fichier ou répertoire de ce type : 'im-not-here.txt'

Nous pouvons tirer parti de cette situation et gérer l’exception au cas où le fichier que nous recherchons n’existerait pas.

Dans <x><x><x><x><x><x><x><x><x><x><x><x><x>[2]</x></x></x></x></x></x></x></x></x></x></x></x></x>: try :
   ... : file = open('im-not-here.txt')
   ... : print(file) # Gestionnaire de fichiers
   ... : file.close()
   ... : except FileNotFoundError :
   ... : print('Sorry the file we\'re looking for doesn't exist')
   ... : exit()
   ... : 
Désolé, le fichier que nous recherchons n'existe pas

Dans le code ci-dessus, nous imprimons un message personnalisé et arrêtons l’exécution du programme si le fichier n’existe pas.

Notez que la fonction exit() ne s’exécute que si une exception est levée. Voyons ce qui se passe lorsque le fichier que nous recherchons existe réellement.

Dans <x><x><x><x><x><x><x><x><x><x><x><x><x>[2]</x></x></x></x></x></x></x></x></x></x></x></x></x>: try :
   ... : file = open('testfile.txt')
   ... : print(file) # Gestionnaire de fichiers
   ... : file.close()
   ... : except FileNotFoundError :
   ... : print('Sorry the file we're looking for doesn't exist')
   ... : exit()
   ... : 
<_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'>

Notez que nous fermons le fichier juste après l’avoir ouvert. C’est une bonne pratique selon la documentation Python.

Appeler <span class="pre">file.write()</span> sans utiliser le mot-clé <span class="pre">with</span> ou appeler <span class="pre">file.close()</span> peut avoir pour conséquence que les arguments de <span class="pre">file.write(</span> ) ne soient pas complètement écrits sur le disque, même si le programme se termine avec succès.

Même si nous n’écrivons pas dans le fichier, il est fortement recommandé de fermer le fichier, car cela pourrait entraîner de nombreux problèmes de performance.

Si nous ne voulons pas fermer le fichier nous-mêmes, nous pouvons utiliser le gestionnaire de contexte with . Il alloue et libère les ressources avec précision, et nous n’aurons donc pas besoin de fermer le fichier.

Dans <x><x><x><x><x><x><x><x><x><x><x><x>[3]</x></x></x></x></x></x></x></x></x></x></x></x>: try :
   ... : with open('testfile.txt') as file :
   ... : print(file)
   ... :         # Pas besoin de fermer le fichier
   ... : except FileNotFoundError :
   ... : print('Sorry the file we're looking for doesn't exist')
   ... : exit()
   ... : 
   ... : 
<_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'>

Cette méthode est extrêmement utile pour écrire dans des fichiers, mais s’avère inefficace si nous voulons seulement vérifier si un fichier existe. Examinons d’autres options pour y parvenir.

os.path.exists()

Le module os fournit de nombreuses fonctions pour interagir avec le système opérationnel. Pour vérifier si un fichier ou un dossier existe, nous pouvons utiliser la fonction path.exists() qui accepte le chemin du fichier ou du répertoire comme argument. Elle renvoie un booléen basé sur l’existence du chemin.

Remarque : un chemin est l’emplacement unique d’un fichier ou d’un répertoire dans un système de fichiers

En Python, le sous-module os.path contient des fonctions exclusivement conçues pour exploiter les chemins d’accès aux fichiers. Toutes ces fonctions acceptent l’argument du chemin sous forme de chaînes ou d’octets, et vous pouvez décider de travailler avec des chemins absolus, par exemple :

/home/daniel/.bashrc

Ou avec des chemins relatifs, en fonction du répertoire dans lequel vous exécutez le script :

.bashrc
# Exécution du script dans mon dossier personnel

Voici plusieurs exemples utilisant la fonction os.path.exists() , exécutée dans le répertoire où se trouvent mes fichiers de test :

Dans <x><x><x><x><x><x>[1]</x></x></x></x></x></x>: import os

In [ <x><x><x><x><x><x><x><x><x><x><x><x><x>2]</x></x></x></x></x></x></x></x></x></x></x></x></x>: os.path.exists('testfile.txt')
Out<x><x><x><x><x><x><x><x><x><x><x><x><x>[2]</x></x></x></x></x></x></x></x></x></x></x></x></x>: True

In <x><x><x><x><x><x><x><x><x><x><x><x>[3]</x></x></x></x></x></x></x></x></x></x></x></x>: os.path.exists('testdirectory')
Out<x><x><x><x><x><x><x><x><x><x><x><x>[3</x></x></x></x></x></x></x></x></x></x></x></x>] : True

In <x><x><x><x><x><x><x><x><x><x><x>[4]</x></x></x></x></x></x></x></x></x></x></x>: os.path.exists('hey-i-dont-exist')
Out<x><x><x><x><x><x><x><x><x><x><x>[4</x></x></x></x></x></x></x></x></x></x></x>] : False

Comme vous pouvez le voir, cette méthode renvoie True lorsque le test est effectué avec le fichier testfile.txt et le dossier testdirectory, et False lorsque le fichier n’existe pas.

os.path.isfile()

Si vous souhaitez uniquement prouver l’existence d’un fichier (et non d’un répertoire), vous devez appeler la fonction os.path.isfile().

Dans <x><x><x><x><x><x>[1]</x></x></x></x></x></x>: import os

In [ <x><x><x><x><x><x><x><x><x><x><x><x><x>2]</x></x></x></x></x></x></x></x></x></x></x></x></x>: os.path.isfile('testfile.txt')
Out<x><x><x><x><x><x><x><x><x><x><x><x><x>[2]</x></x></x></x></x></x></x></x></x></x></x></x></x>: True

In <x><x><x><x><x><x><x><x><x><x><x><x>[3]</x></x></x></x></x></x></x></x></x></x></x></x>: os.path.isfile('testdirectory/')
Out<x><x><x><x><x><x><x><x><x><x><x><x>[3</x></x></x></x></x></x></x></x></x></x></x></x>] : False

In <x><x><x><x><x><x><x><x><x><x><x>[4]</x></x></x></x></x></x></x></x></x></x></x>: os.path.isfile('i-dont-even-exist')
Out<x><x><x><x><x><x><x><x><x><x><x>[4</x></x></x></x></x></x></x></x></x></x></x>] : False : False

In [ <x><x><x><x><x><x><x>5]</x></x></x></x></x></x></x>: os.path.isfile('testdirectory/otherfile.txt')
Out<x><x><x><x><x><x><x>[5</x></x></x></x></x></x></x>] : True

Remarque : sous UNIX, tous les répertoires se terminent par une barre oblique (/), alors que sous Windows, nous utilisons une barre oblique inverse (\).

Dans le code ci-dessus, la fonction isfile() renvoie False à deux reprises, voyons pourquoi :

  • testdirectory/ est un répertoire, il n’est donc pas considéré comme un fichier. Ce n’est pas tout à fait vrai puisque sous Linux tout est un descripteur de fichier, mais Python traite les répertoires différemment pour des raisons de commodité (si vous essayez d’ouvrir un répertoire, vous obtiendrez une erreur IsADirectoryError)
  • i-dont-even-exist pointe vers un fichier qui, ironiquement, n’existe pas

os.path.isdir()

Si vous souhaitez vérifier qu’un répertoire se trouve au bon endroit, vous devez utiliser la fonction os.path.isdir() , qui renvoie uniquement True si le chemin donné pointe vers un répertoire.

Dans <x><x><x><x><x><x>[1]</x></x></x></x></x></x>: import os

In [ <x><x><x><x><x><x><x><x><x><x><x><x><x>2]</x></x></x></x></x></x></x></x></x></x></x></x></x>: os.path.isdir('testfile.txt')
Out<x><x><x><x><x><x><x><x><x><x><x><x><x>[2]</x></x></x></x></x></x></x></x></x></x></x></x></x>: False

In [ <x><x><x><x><x><x><x><x><x><x><x><x>3]</x></x></x></x></x></x></x></x></x></x></x></x>: os.path.isdir('testdirectory')
Out<x><x><x><x><x><x><x><x><x><x><x><x>[3</x></x></x></x></x></x></x></x></x></x></x></x>] : True

In <x><x><x><x><x><x><x><x><x><x><x>[4]</x></x></x></x></x></x></x></x></x></x></x>: os.path.isdir('autrefichier.txt')
Out<x><x><x><x><x><x><x><x><x><x><x>[4</x></x></x></x></x></x></x></x></x></x></x>] : False

Notez que les exemples ci-dessus renvoient False même si le chemin pointe vers un fichier qui existe.

Glob

Le module glob fournit des fonctions permettant de travailler avec des motifs de type shell Unix (c’est pourquoi il ne fonctionne pas correctement sous Windows). Pour vérifier si un fichier correspond à un motif dans le répertoire courant, vous pouvez utiliser la fonction glob.glob().

Dans <x><x><x><x><x><x>[1]</x></x></x></x></x></x>: import glob

In [ <x><x><x><x><x><x><x><x><x><x><x><x><x>2]</x></x></x></x></x></x></x></x></x></x></x></x></x>: glob.glob('testfile.txt')
Out<x><x><x><x><x><x><x><x><x><x><x><x><x>[2]</x></x></x></x></x></x></x></x></x></x></x></x></x>: ['testfile.txt']

In [ <x><x><x><x><x><x><x><x><x><x><x><x>3]</x></x></x></x></x></x></x></x></x></x></x></x>: glob.glob('testdirectory')
Sortie<x><x><x><x><x><x><x><x><x><x><x><x>[3]</x></x></x></x></x></x></x></x></x></x></x></x>: ['testdirectory'] ['testfile.txt'] ['testdirectory']

Dans le code ci-dessus, le motif transmis à la fonction glob est une chaîne normale qui représente le chemin d’accès au fichier et au répertoire de test. Comme les deux chemins existent, la fonction renvoie une liste contenant les noms de chemin correspondants.

Remarque : si le motif ne correspond pas, vous obtiendrez une liste vide.

Étant donné que nous pouvons passer des motifs à la fonction glob, pourquoi ne pas tester certains de ses principaux avantages ?

Le code ci-dessous récupère tous les chemins de fichiers avec une extension .txt et .py respectivement :

In <x><x><x><x><x><x><x><x><x><x><x>[4]</x></x></x></x></x></x></x></x></x></x></x>: glob.glob('*.txt')
Out<x><x><x><x><x><x><x><x><x><x><x>[4]</x></x></x></x></x></x></x></x></x></x></x>: ['testfile.txt']

Dans [5 <x><x><x><x><x><x><x>]</x></x></x></x></x></x></x>: glob.glob('*.py')
Out<x><x><x><x><x><x><x>[5</x></x></x></x></x></x></x>] : ['pathlib-exists.py'] : 
['pathlib-exists.py',
 'list-dir.py',
 'glob-file.py',
 'open-except.py',
 'subprocess-test.py',
 'isfile.py',
 'exists.py',
 'isdir.py']

Utilisation de la classe Path

La classe Path est l’une des meilleures façons de travailler avec les chemins, car elle nous offre une interface propre pour travailler avec les chemins de fichiers en tant qu’objets.

La cerise sur le gâteau est que les instances Path possèdent toutes les méthodes dont vous avez besoin pour obtenir des informations sur un certain chemin. Cela inclut des fonctionnalités similaires aux options précédentes.

Note : Vous aurez besoin de Python 3.4 ou plus pour utiliser la bibliothèque pathlib

Les méthodes Path que vous utiliserez :

Vérifier si un chemin existe

Dans <x><x><x><x><x><x>[1]</x></x></x></x></x></x>: from pathlib import Path

Dans [ <x><x><x><x><x><x><x><x><x><x><x><x><x>2]</x></x></x></x></x></x></x></x></x></x></x></x></x>: Path('testfile.txt').exists()
Out<x><x><x><x><x><x><x><x><x><x><x><x><x>[2]</x></x></x></x></x></x></x></x></x></x></x></x></x>: True

Dans [ <x><x><x><x><x><x><x><x><x><x><x><x>3</x></x></x></x></x></x></x></x></x></x></x></x>] : Path('im-not-here.txt').exists() Chemin('im-not-here.txt').existe()
Out<x><x><x><x><x><x><x><x><x><x><x><x>[3</x></x></x></x></x></x></x></x></x></x></x></x>] : Faux

In <x><x><x><x><x><x><x><x><x><x><x>[4]</x></x></x></x></x></x></x></x></x></x></x>: Path('testdirectory').exists()
Out<x><x><x><x><x><x><x><x><x><x><x>[4</x></x></x></x></x></x></x></x></x></x></x>] : True

Fonctionne de la même manière que os.path.exists().

Vérifie si le chemin pointe vers un fichier

Dans <x><x><x><x><x><x><x>[5]</x></x></x></x></x></x></x>: Path('testfile.txt').is_file()
Out<x><x><x><x><x><x><x>[5]</x></x></x></x></x></x></x>: True

Dans <x><x><x>[6</x></x></x>] : Path('testdirectory').is_file() Chemin('testdirectory').is_file()
Out<x><x><x>[6</x></x></x>] : False

Équivalent à os.path.isfile().

Vérifier si le chemin pointe vers un répertoire

Dans <x><x><x>[7]</x></x></x>: Path('testfile.txt').is_dir()
Out<x><x><x>[7]</x></x></x>: False

In <x>[8</x>] : Chemin('testdirectory').is_dir()
Out<x>[8</x>] : True

Correspond à os.path.isdir().

sous-processus

Si vous aimez le module subprocess, vous devez connaître cette option. Vous pouvez déterminer si un fichier ou un dossier existe en utilisant la commande test.

Remarque : la commande test ne fonctionne que sous Unix.

Les drapeaux de test suivants vous permettront de faire le travail :

  • test -e : Vérifie si un chemin existe
  • test -f : Vérifie si un fichier existe
  • test-d : Vérifier si un dossier existe

Au cas où vous voudriez vous plonger dans d’autres drapeaux de test, vous pouvez lire le manuel en exécutant :

man test

Vérifier un chemin avec un sous-processus :

Le code ci-dessous détermine si un chemin existe en comparant le code de retour du sous-processus à 0.

Rappelez-vous que sous Linux, si un processus s’est bien déroulé, il renvoie zéro, sinon il renvoie n’importe quel autre code.

Dans <x><x><x><x><x><x>[1]</x></x></x></x></x></x>: from subprocess import run

In [ <x><x><x><x><x><x><x><x><x><x><x><x><x>2]</x></x></x></x></x></x></x></x></x></x></x></x></x>: run(['test', '-e', 'testfile.txt']).returncode == 0
Out<x><x><x><x><x><x><x><x><x><x><x><x><x>[2]</x></x></x></x></x></x></x></x></x></x></x></x></x>: True

In [ <x><x><x><x><x><x><x><x><x><x><x><x>3]</x></x></x></x></x></x></x></x></x></x></x></x>: run(['test', '-e', 'im-not-here.txt']).returncode == 0
Out<x><x><x><x><x><x><x><x><x><x><x><x>[3</x></x></x></x></x></x></x></x></x></x></x></x>] : False

Dans la première instruction, nous importons le module subprocess, puis nous utilisons la fonction run et obtenons son code de retour.

Vérification de l’existence d’un fichier avec subprocess

In <x><x><x><x><x><x><x><x><x><x><x>[4]</x></x></x></x></x></x></x></x></x></x></x>: run(['test', '-f', 'testfile.txt']).returncode == 0
Out<x><x><x><x><x><x><x><x><x><x><x>[4]</x></x></x></x></x></x></x></x></x></x></x>: True

In [ <x><x><x><x><x><x><x>5]</x></x></x></x></x></x></x>: run(['test', '-f', 'testdirectory']).returncode == 0
Out<x><x><x><x><x><x><x>[5]</x></x></x></x></x></x></x>: False

Vérification d’un répertoire avec un sous-processus :

In <x><x><x>[6]</x></x></x>: run(['test', '-d', 'testfile.txt']).returncode == 0
Out<x><x><x>[6]</x></x></x>: False

In [ <x><x><x>7]</x></x></x>: run(['test', '-d', 'testdirectory']).returncode == 0
Out<x><x><x>[7]</x></x></x>: True True

Il n’est pas recommandé d’utiliser cette option car elle consomme plus de ressources et nous n’en tirons aucun avantage.

En résumé

Python est l’un des langages de programmation les plus utilisés pour automatiser des processus en interagissant avec le système d’exploitation. Une chose intéressante que vous pouvez faire avec lui est de vérifier si un fichier ou un dossier existe.

Les méthodes les plus simples pour ce faire sont les suivantes :

  • Ouvrir et gérer immédiatement les exceptions de fichiers
  • Utiliser la fonction exists() des modules os.path ou pathlib.

Dans ce tutoriel, vous avez appris :

  • Comment ouvrir un fichier et gérer les exceptions au cas où il n’existerait pas
  • La signification des chemins
  • 3 fonctions différentes que le sous-module os.path fournit pour vérifier l’existence d’un fichier ou d’un dossier
  • Unix utilise des barres obliques avant (/), tandis que Windows utilise des barres obliques arrière (\)

Lire la suite : Qu’est-ce qu’un sous-processus en Python ? [5 exemples d’utilisation]