Geekflare est soutenu par son public. Nous pouvons percevoir des commissions d'affiliation sur les liens d'achat présents sur ce site.
En Développement Dernière mise à jour : 24 septembre 2023
Partager sur :
Invicti Web Application Security Scanner - la seule solution qui offre une vérification automatique des vulnérabilités avec Proof-Based Scanning™.

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 scénario 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 si un fichier ou un dossier existe 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 utiliserons quelques fichiers de test dans ce tutoriel, assurez-vous donc de créer les fichiers suivants

touch testfile.txt

mkdir

testdirectory/
touch testdirectory/otherfile.txt

Les commandes ci-dessus créent un fichier avec lequel jouer, un répertoire de test et un autre fichier dans le 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 interactif pour Python, 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 juste en tapant ipython

L'interpréteur de commandes interactif Ipython utilise 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] No such file or directory : 'im-not-here.t

xt'


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) # File handler
... : file.close()
... : except FileNotFoundError :
... : print('SorryFoundError').... : print('Sorry the file we\'re looking for doesn't exist')
... : exit()
... :
Sorry the file we're looking for doesn't exist

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) # File handler
... : file.close()
... : except FileNotFoundError :
... : print('Désolé, le fichier que nous cherchons n'existe pas).: print('Sorry the file we\'re looking for doesn't exist')
... : exit()
... :
<_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'&gt

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 avec . Il alloue et libère les ressources avec précision, ce qui évite de devoir 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'&gt

Cette méthode est extrêmement utile pour écrire dans des fichiers, mais elle est 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 chemin.existe() qui accepte le chemin du fichier ou du répertoire comme argument. Elle renvoie un booléen en fonction de 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écuter le 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

In <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 Vrai lorsque le test est effectué avec le fichier testfile.txt et le dossier répertoire de test, et Faux 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()

In <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

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 Faux à 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 voulez vérifier qu'un répertoire se trouve au bon endroit, vous devez utiliser la fonction os.path.isdir() , qui ne renvoie que Vrai si le chemin donné pointe vers un répertoire

In <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('anotherfile.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 Faux même si le chemin pointe vers un fichier existant

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

In <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')
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>: ['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

Etant 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']

In <x><x><x><x><x><x><x>[5]</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',
 '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 utilisez

Vérifier si un chemin existe

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

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>: 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

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>: Path('im-not-here.txt').exists()
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>: 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érifiez 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

In <x><x><x>[6]</x></x></x>: Path('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>: Path('testdirectory').is_dir()
Out<x>[8]</x>: True

Correspondre à os.path.isdir()

sous-processus

Si vous aimez le module sous-processus, 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 l'existence d'un fichier
  • test-d : Vérifier l'existence d'un dossier

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

In <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

Dans <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

Dans <x><x><x>[7]</x></x></x>: run(['test', '-d', 'testdirectory']).returncode == 0
Out<x><x><x>[7]</x></x></x>: 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 sont les suivantes

  • Ouvrir et gérer immédiatement les exceptions de fichiers
  • Utiliser la fonction existe() 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 fournies par le sous-module os.path 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]

  • Daniel Diaz
    Auteur
Merci à nos sponsors
D'autres lectures intéressantes sur le développement
Alimentez votre entreprise
Quelques outils et services pour aider votre entreprise à se développer.
  • Invicti utilise le Proof-Based Scanning™ pour vérifier automatiquement les vulnérabilités identifiées et générer des résultats exploitables en quelques heures seulement.
    Essayez Invicti
  • Web scraping, proxy résidentiel, proxy manager, web unlocker, search engine crawler, et tout ce dont vous avez besoin pour collecter des données web.
    Essayez Brightdata
  • Monday.com est un système d'exploitation tout-en-un qui vous aide à gérer vos projets, vos tâches, votre travail, vos ventes, votre CRM, vos opérations, vos flux de travail et bien plus encore.
    Essayez le lundi
  • Intruder est un scanner de vulnérabilité en ligne qui détecte les faiblesses de votre infrastructure en matière de cybersécurité, afin d'éviter des violations de données coûteuses.
    Essayer l'intrus