Die Python-Standardbibliothek bietet eine Vielzahl von Werkzeugen, die Entwickler benötigen, um Aufgaben zu bewältigen. In dieser Anleitung werden verschiedene Methoden vorgestellt, mit denen Sie mithilfe von eingebauten Modulen feststellen können, ob eine Datei oder ein Verzeichnis existiert.
Für jedes Befehlszeilenprogramm ist es entscheidend zu überprüfen, ob eine Datei oder ein Skript am richtigen Ort vorhanden ist. Ihr Programm könnte nicht funktionieren, wenn eine bestimmte Datei zum Zeitpunkt der Ausführung nicht verfügbar ist.
In diesem Tutorial werden wir uns einige einfache Methoden ansehen, mit denen man überprüfen kann, ob eine Datei oder ein Ordner in Python vorhanden ist.
Bevor wir beginnen
Stellen Sie sicher, dass Python 3 auf Ihrem System installiert ist, bevor Sie einen der folgenden Befehle ausführen. Öffnen Sie Ihr Terminal und geben Sie den folgenden Befehl ein:
python --version # Python 3.9.5, mein Ergebnis
Wenn Sie eine Version 2.x haben, müssen Sie den Befehl „python3“ verwenden. Werfen Sie einen Blick auf unseren Python-Installationsleitfaden, falls Sie Python 3 nicht installiert haben.
Für dieses Tutorial werden wir einige Testdateien verwenden. Stellen Sie daher sicher, dass Sie die folgenden Dateien erstellen:
touch testfile.txt mkdir testdirectory/ touch testdirectory/otherfile.txt
Die oben genannten Befehle erstellen eine Datei zum Spielen, ein Testverzeichnis und eine zusätzliche Datei im Testverzeichnis. Die Dateien können leer sein, da wir ihren Inhalt nicht lesen müssen.
Hinweis: Wenn Sie Windows verwenden, erstellen Sie diese einfache Dateistruktur mit einem grafischen Dateimanager.
Schließlich werden wir Ipython als unsere interaktive Python-Shell verwenden, die eine komfortable Benutzeroberfläche bietet. Dies ist optional und nicht unbedingt erforderlich.
pip install ipython
Danach erhalten Sie Zugriff auf eine praktische Python-Shell, indem Sie einfach ipython
eingeben.
Nun sind Sie bereit. Lassen Sie uns verschiedene Methoden zur Überprüfung auf die Existenz von Ordnern oder Dateien in Python erkunden.
Try, Open und Except
Dies ist die einfachste Möglichkeit. Wenn Sie versuchen, eine Datei zu öffnen, die nicht existiert, löst Python eine FileNotFoundError aus.
In [1]: open('im-not-here.txt') --------------------------------------------------------------------------- FileNotFoundError: [Errno 2] No such file or directory: 'im-not-here.txt'
Wir können dies nutzen und die Ausnahme behandeln, wenn die gesuchte Datei nicht vorhanden ist.
In [2]: try: ...: file = open('im-not-here.txt') ...: print(file) # Dateihandler ...: file.close() ...: except FileNotFoundError: ...: print('Entschuldigung, die gesuchte Datei existiert nicht') ...: exit() ...: Entschuldigung, die gesuchte Datei existiert nicht
Im obigen Code geben wir eine benutzerdefinierte Nachricht aus und beenden die Programmausführung, wenn die Datei nicht existiert.
Beachten Sie, dass die Funktion exit()
nur aufgerufen wird, wenn eine Ausnahme ausgelöst wird. Schauen wir mal, was passiert, wenn die gesuchte Datei tatsächlich existiert.
In [2]: try: ...: file = open('testfile.txt') ...: print(file) # Dateihandler ...: file.close() ...: except FileNotFoundError: ...: print('Entschuldigung, die gesuchte Datei existiert nicht') ...: 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 gemäß der Python-Dokumentation als gute Praxis.
Der Aufruf von file.write()
ohne die Verwendung des Schlüsselworts with
oder der Aufruf von file.close()
kann dazu führen, dass die Argumente von file.write()
nicht vollständig auf die Festplatte geschrieben werden, auch wenn das Programm erfolgreich beendet wird.
Selbst wenn wir nicht in die Datei schreiben, wird dringend empfohlen, die Datei zu schließen, da dies zu verschiedenen Leistungsproblemen führen kann.
Wenn wir die Datei nicht manuell schließen möchten, können wir den with
Kontextmanager verwenden. Er weist Ressourcen präzise zu und gibt sie frei, sodass wir die Datei nicht schließen müssen.
In [3]: try: ...: with open('testfile.txt') as file: ...: print(file) ...: # Die Datei muss nicht geschlossen werden ...: except FileNotFoundError: ...: print('Entschuldigung, die gesuchte Datei existiert nicht') ...: exit() ...: <_io.TextIOWrapper name="testfile.txt" mode="r" encoding='UTF-8'>
Diese Methode ist äußerst nützlich, wenn man in Dateien schreibt, aber nicht effizient, wenn man nur prüfen möchte, ob eine Datei existiert. Lassen Sie uns andere Optionen untersuchen, um das zu erreichen.
os.path.exists()
Das os-Modul bietet verschiedene Funktionen zur Interaktion mit dem Betriebssystem. Um zu überprüfen, ob eine Datei oder ein Ordner vorhanden ist, können wir die Funktion path.exists()
verwenden, die den Pfad zur Datei oder zum Verzeichnis als Argument akzeptiert. Sie 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 enthält das os.path-Submodul Funktionen, die speziell für die Arbeit mit Dateipfaden entwickelt wurden. Alle diese Funktionen akzeptieren das Pfadargument als Zeichenketten oder Bytes, und Sie können entweder mit absoluten Pfaden arbeiten, zum Beispiel:
/home/daniel/.bashrc
oder mit relativen Pfaden, abhängig von dem Verzeichnis, in dem Sie das Skript ausführen:
.bashrc # Das Skript wird in meinem Home-Ordner ausgeführt
Hier sind einige 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 die Datei testfile.txt
und der Ordner testdirectory
getestet werden, und False
, wenn die Datei nicht existiert.
os.path.isfile()
Wenn Sie nur die Existenz einer Datei (nicht eines Verzeichnisses) nachweisen 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. Schauen wir mal, warum:
testdirectory/
ist ein Verzeichnis und wird daher nicht als Datei betrachtet. Das ist nicht ganz richtig, da in Linux alles ein Dateideskriptor ist, aber Python behandelt Verzeichnisse der Einfachheit halber anders (wenn Sie versuchen, ein Verzeichnis zu öffnen, erhalten Sie einenIsADirectoryError
).i-dont-even-exist
verweist auf eine Datei, die ironischerweise nicht existiert.
os.path.isdir()
Wenn Sie überprüfen möchten, ob sich ein Verzeichnis am richtigen Ort befindet, müssen Sie die Funktion os.path.isdir()
verwenden, die nur True
zurückgibt, wenn der angegebene Pfad auf ein Verzeichnis verweist.
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, auch wenn der Pfad auf eine vorhandene Datei verweist.
Glob
Das glob-Modul bietet Funktionen zum Arbeiten mit Unix-Shell-ähnlichen Mustern (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 Funktion glob.glob()
verwenden.
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 Zeichenkette, die den Pfad zur Testdatei und zum Verzeichnis darstellt. Da beide Pfade existieren, gibt die Funktion eine Liste mit den übereinstimmenden Pfadnamen zurück.
Hinweis: Wenn das Muster nicht übereinstimmt, erhalten Sie eine leere Liste.
Angesichts der Tatsache, dass wir Muster an die glob
-Funktion übergeben können, warum nicht einige der wichtigsten Vorteile 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']
Verwendung der Path-Klasse
Die Path-Klasse ist eine der besten Möglichkeiten, mit Pfaden zu arbeiten, da sie uns eine klare Schnittstelle zur Arbeit mit Dateipfaden als Objekte 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 verwenden zu können.
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 verweist
In [5]: Path('testfile.txt').is_file() Out[5]: True In [6]: Path('testdirectory').is_file() Out[6]: False
Entspricht os.path.isfile()
.
Überprüfen Sie, ob der Pfad auf ein Verzeichnis verweist
In [7]: Path('testfile.txt').is_dir() Out[7]: False In [8]: Path('testdirectory').is_dir() Out[8]: True
Entspricht os.path.isdir()
.
Subprozess
Wenn Sie ein Fan von Unterprozessmodulen sind, sollten Sie sich dieser Option bewusst sein. Sie können feststellen, ob eine Datei oder ein Ordner vorhanden ist, indem Sie den test
-Befehl verwenden.
Hinweis: Der Testbefehl funktioniert nur unter Unix.
Die folgenden Test-Flags erledigen die Arbeit:
test -e
: Prüfen, ob ein Pfad vorhanden ist.test -f
: Prüfen, ob eine Datei vorhanden ist.test -d
: Prüfen, ob ein Ordner vorhanden ist.
Falls Sie sich mit weiteren Test-Flags beschäftigen möchten, können Sie das Handbuch lesen, indem Sie Folgendes ausführen:
man test
Überprüfen eines Pfads mit einem 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 run
und rufen ihren Rückgabecode ab.
Überprüfen der Existenz einer Datei mit einem 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 einem 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.
Zusammenfassend
Python ist eine der am häufigsten verwendeten Programmiersprachen zur Automatisierung von Prozessen durch Interaktion mit dem Betriebssystem. Eine coole Sache, die Sie damit tun können, ist zu überprüfen, ob eine Datei oder ein Ordner existiert.
Am einfachsten geht das:
- Öffnen und Behandeln Sie Dateiausnahmen direkt.
- Verwenden Sie die
exists()
-Funktion deros.path
– oderpathlib
-Module.
In diesem Tutorial haben Sie gelernt:
- Wie man eine Datei öffnet und Ausnahmen behandelt, wenn sie nicht existiert.
- Die Bedeutung von Pfaden.
- 3 verschiedene Funktionen, die das
os.path
-Submodul 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 Anwendungsbeispiele]