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.
Inhaltsverzeichnis
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]