7 Möglichkeiten, um zu überprüfen, ob eine Datei oder ein Ordner in Python existiert

Die Python-Standardbibliothek enthält die meisten Funktionen, die ein Entwickler zur Lösung eines Problems benötigen würde. In diesem Lernprogramm lernen Sie verschiedene Möglichkeiten kennen, um die Existenz einer Datei oder eines Verzeichnisses nur mit integrierten Modulen zu überprüfen.

Die Überprüfung, ob sich eine Datei oder ein Skript an der richtigen Stelle befindet, ist für jedes CLI-Programm von entscheidender Bedeutung. Ihr Programm könnte unbrauchbar werden, wenn eine bestimmte Datei zum Zeitpunkt der Ausführung nicht vorhanden ist.

Im heutigen Tutorial lernen Sie einige schnelle Möglichkeiten kennen, um zu überprüfen, ob eine Datei oder ein Ordner in Python vorhanden ist.

Bevor es losgeht

Bevor Sie einen der folgenden Befehle ausführen, stellen Sie sicher, dass Python 3 auf Ihrem System installiert ist. Öffnen Sie Ihr Terminal und geben Sie den folgenden Befehl ein:

python --version
# Python 3.9.5, my result

Wenn Sie eine 2.x-Version haben, müssen Sie den Befehl „python3“ verwenden. Sehen Sie sich unsere Python-Installationsanleitung an, wenn Sie Python 3 nicht installiert haben.

Wir werden zusammen mit diesem Tutorial einige Testdateien verwenden, stellen Sie also sicher, dass Sie die folgenden Dateien erstellen:

touch testfile.txt
mkdir testdirectory/ 
touch testdirectory/otherfile.txt

Die obigen Befehle erstellen eine Datei zum Spielen, ein Testverzeichnis und eine weitere Datei innerhalb des Testverzeichnisses. Die Dateien können leer sein, da wir ihren Inhalt nicht lesen müssen,

Hinweis: Wenn Sie Windows verwenden, richten Sie diese einfache Dateistruktur mit einem grafischen Dateimanager ein.

Schließlich werden wir verwenden Ipython als unsere interaktive Python-Shell, die eine hübsche Schnittstelle zum Arbeiten bietet. Dies ist nur eine Ware, daher nicht unbedingt erforderlich.

pip install ipython

Danach erhalten Sie Zugriff auf eine schöne Python-Shell, indem Sie einfach ipython eingeben.

Jetzt sind Sie bereit, lassen Sie uns in Möglichkeiten eintauchen, um zu überprüfen, ob ein Ordner oder eine Datei in Python vorhanden ist.

Versuchen, Öffnen und Außer

Dies ist die einfachste Option. Wenn Sie versuchen, eine Datei zu öffnen, die nicht existiert, löst Python eine aus FileNotFoundError.

In [1]: open('im-not-here.txt')
---------------------------------------------------------------------------
FileNotFoundError: [Errno 2] No such file or directory: 'im-not-here.txt'

Wir können dies ausnutzen und die Ausnahme behandeln, falls die Datei, nach der wir suchen, nicht existiert.

In [2]: try:
   ...:     file = open('im-not-here.txt')
   ...:     print(file) # File handler
   ...:     file.close()
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we're looking for doesn' exist')
   ...:     exit()
   ...: 
Sorry the file we're looking for doesn't exist

Im obigen Code drucken wir eine benutzerdefinierte Nachricht und stoppen die Ausführung des Programms, wenn die Datei nicht existiert.

Beachten Sie, dass die Funktion exit() nur ausgeführt wird, wenn eine Ausnahme ausgelöst wird. Mal sehen, was passiert, wenn die gesuchte Datei tatsächlich existiert.

In [2]: try:
   ...:     file = open('testfile.txt')
   ...:     print(file) # File handler
   ...:     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'>

Beachten Sie, wie wir die Datei direkt nach dem Öffnen schließen. Es gilt als eine gute Praxis gemäß der Python-Dokumentation.

Aufruf von file.write() ohne Verwendung des Schlüsselworts with oder Aufruf von file.close() kann dazu führen, dass die Argumente von file.write() nicht vollständig auf die Festplatte geschrieben werden, selbst wenn das Programm erfolgreich beendet wird.

Auch wenn wir nicht in die Datei schreiben, wird dringend empfohlen, die Datei zu schließen, da dies dazu führen könnte mehrere Leistungsprobleme.

Wenn wir die Datei nicht selbst schließen wollen, können wir den with Context Manager verwenden. Es weist Ressourcen präzise zu und gibt sie frei, daher müssen wir die Datei nicht schließen.

In [3]: try:
   ...:     with open('testfile.txt') as file:
   ...:         print(file)
   ...:         # No need to close the file
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we're looking for doesn't exist')
   ...:     exit()
   ...: 
   ...: 
<_io.TextIOWrapper name="testfile.txt" mode="r" encoding='UTF-8'>

Diese Methode ist äußerst nützlich beim Schreiben in Dateien, ist jedoch ineffizient, wenn wir nur prüfen möchten, ob eine Datei existiert. Lassen Sie uns in andere Optionen eintauchen, um dies zu erreichen.

os.path.exists()

Das os-Modul stellt mehrere Funktionen bereit, um mit dem Betriebssystem zu interagieren. Um zu überprüfen, ob eine Datei oder ein Ordner existiert, können wir die Funktion path.exists() verwenden, die den Pfad zu der Datei oder dem Verzeichnis als Argument akzeptiert. Es gibt einen booleschen Wert basierend auf der Existenz des Pfads zurück.

Hinweis: Ein Pfad ist der eindeutige Speicherort einer Datei oder eines Verzeichnisses in einem Dateisystem

In Python ist die os.Pfad Submodul enthält Funktionen, die ausschließlich für die Arbeit mit Dateipfaden entwickelt wurden. Alle diese Funktionen akzeptieren das Pfadargument als Zeichenfolgen oder Bytes, und Sie können sich entscheiden, mit absoluten Pfaden zu arbeiten, zum Beispiel:

/home/daniel/.bashrc

Oder mit relativen Pfaden, abhängig von dem Verzeichnis, in dem Sie das Skript ausführen:

.bashrc
# Running the script in my home folder

Hier sind mehrere Beispiele für die Verwendung der Funktion os.path.exists(), die in dem Verzeichnis ausgeführt wird, in dem sich meine Testdateien befinden:

In [1]: import os

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

In [3]: os.path.exists('testdirectory')
Out[3]: True

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

Wie Sie sehen können, gibt es True zurück, wenn es mit der Datei testfile.txt und dem Ordner testdirectory testet, und False, wenn die Datei nicht existiert.

os.path.isfile()

Wenn Sie nur die Existenz einer Datei (nicht eines Verzeichnisses) beweisen wollten, würden Sie die Funktion os.path.isfile() aufrufen.

In [1]: import os

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

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

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

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

Hinweis: In UNIX enden alle Verzeichnisse mit einem Schrägstrich (/), während wir in Windows einen umgekehrten Schrägstrich () verwenden.

Im obigen Code gibt die Funktion isfile() zweimal False zurück, mal sehen warum:

  • testdirectory/ ist ein Verzeichnis und wird daher nicht als Datei betrachtet. Dies ist nicht absolut wahr, da in Linux alles ist ein Dateideskriptoraber Python behandelt Verzeichnisse nur der Einfachheit halber anders (Wenn Sie versuchen, ein Verzeichnis zu öffnen, erhalten Sie einen IsADirectoryError)
  • i-dont-even-exist zeigt auf eine Datei, die ironischerweise nicht existiert

os.path.isdir()

Wenn Sie überprüfen möchten, ob sich ein Verzeichnis an der richtigen Stelle befindet, müssen Sie die Funktion os.path.isdir() verwenden, die nur True zurückgibt, wenn der angegebene Pfad auf ein Verzeichnis zeigt.

In [1]: import os

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

In [3]: os.path.isdir('testdirectory')
Out[3]: True

In [4]: os.path.isdir('anotherfile.txt')
Out[4]: False

Beachten Sie, dass die obigen Beispiele False zurückgeben, selbst wenn der Pfad auf eine vorhandene Datei zeigt.

Glob

Das Kugel Modul stellt Funktionen bereit, mit denen gearbeitet werden kann Unix-Shell-ähnliche Muster (daher funktioniert es unter Windows nicht richtig). Um zu überprüfen, ob eine Datei mit einem Muster im aktuellen Verzeichnis übereinstimmt, können Sie die verwenden glob.glob() Funktion.

In [1]: import glob

In [2]: glob.glob('testfile.txt')
Out[2]: ['testfile.txt']

In [3]: glob.glob('testdirectory')
Out[3]: ['testdirectory']

Im obigen Code ist das an die glob-Funktion übergebene Muster eine normale Zeichenfolge, die den Pfad zur Testdatei und zum Verzeichnis darstellt. Da beide Pfade existieren, gibt die Funktion eine Liste mit den übereinstimmenden Pfadnamen darin zurück.

Hinweis: Wenn das Muster nicht übereinstimmt, erhalten Sie eine leere Liste.

Wenn man bedenkt, dass wir Muster an die Glob-Funktion übergeben können, warum nicht einige der Hauptvorteile davon testen?

Der folgende Code ruft alle Dateipfade mit der Erweiterung .txt bzw. .py ab:

In [4]: glob.glob('*.txt')
Out[4]: ['testfile.txt']

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

Verwenden der Pfadklasse

Das Klasse Pfad ist eine der besten Möglichkeiten, mit Pfaden zu arbeiten, da es uns eine saubere Schnittstelle zum Arbeiten mit Dateipfaden als Objekten bietet.

Das Sahnehäubchen ist, dass Path-Instanzen über alle Methoden verfügen, die Sie benötigen, um Informationen über einen bestimmten Pfad zu erhalten. Dies beinhaltet ähnliche Funktionalitäten wie die vorherigen Optionen.

Hinweis: Sie benötigen Python 3.4 oder höher, um die pathlib-Bibliothek zu verwenden

Die Path-Methoden, die Sie verwenden werden:

Überprüfen Sie, ob ein Pfad vorhanden ist

In [1]: from pathlib import Path

In [2]: Path('testfile.txt').exists()
Out[2]: True

In [3]: Path('im-not-here.txt').exists()
Out[3]: False

In [4]: Path('testdirectory').exists()
Out[4]: True

Funktioniert genauso wie os.path.exists().

Überprüfen Sie, ob der Pfad auf eine Datei zeigt

In [5]: Path('testfile.txt').is_file()
Out[5]: True

In [6]: Path('testdirectory').is_file()
Out[6]: False

Äquivalent zu os.path.isfile().

Überprüfen Sie, ob der Pfad auf ein Verzeichnis zeigt

In [7]: Path('testfile.txt').is_dir()
Out[7]: False

In [8]: Path('testdirectory').is_dir()
Out[8]: True

Entspricht os.path.isdir().

Unterprozess

Wenn Sie ein Liebhaber von Unterprozessmodulen sind, müssen Sie über diese Option Bescheid wissen. Sie können feststellen, ob eine Datei oder ein Ordner vorhanden ist, indem Sie die verwenden Testbefehl.

Hinweis: Der Testbefehl funktioniert nur unter Unix.

Die folgenden Testflags erledigen die Arbeit:

  • test -e: Prüfe, ob ein Pfad existiert
  • test -f: Prüfe, ob eine Datei existiert
  • test-d: Prüfe, ob ein Ordner existiert

Falls Sie in weitere Testflags eintauchen möchten, können Sie das Handbuch lesen, indem Sie Folgendes ausführen:

man test

Überprüfen eines Pfads mit Unterprozess:

Der folgende Code bestimmt, ob ein Pfad vorhanden ist, indem der Rückgabecode des Unterprozesses mit 0 verglichen wird.

Denken Sie daran, dass unter Linux, wenn ein Prozess gut gelaufen ist, Null zurückgegeben wird, wenn nicht, wird irgendein anderer Code zurückgegeben.

In [1]: from subprocess import run

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

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

In der ersten Anweisung importieren wir das Unterprozessmodul und verwenden dann die Funktion ausführen und Abrufen seines Rückkehrcodes.

Überprüfen der Existenz einer Datei mit Unterprozess

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

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

Überprüfen eines Verzeichnisses mit Unterprozess:

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

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

Es wird nicht empfohlen, diese Option zu verwenden, da sie mehr Ressourcen verbraucht und wir keinen Vorteil daraus ziehen.

Um zusammenzufassen

Python ist eine der am häufigsten verwendeten Programmiersprachen zur Automatisierung von Prozessen durch Interaktion mit dem Betriebssystem. Eine coole Sache, die Sie damit machen können, ist zu überprüfen, ob eine Datei oder ein Ordner existiert.

Am einfachsten geht das:

  • Sofortiges Öffnen und Behandeln von Dateiausnahmen
  • Verwendung der exist()-Funktion der os.path- oder pathlib-Module.

In diesem Tutorial haben Sie gelernt:

  • Wie man eine Datei öffnet und Ausnahmen behandelt, falls sie nicht existiert
  • Die Bedeutung von Wegen
  • 3 verschiedene Funktionen, die das Submodul os.path bietet, um die Existenz einer Datei oder eines Ordners zu überprüfen
  • Unix verwendet Schrägstriche (/), während Windows Backslashes () verwendet.

Lesen Sie als Nächstes: Was ist ein Unterprozess in Python? [5 Usage Examples]