Die Python-Standardbibliothek enthält die meisten Funktionen, die ein Entwickler benötigt, um ein Problem zu lösen. In diesem Tutorial lernen Sie verschiedene Möglichkeiten kennen, wie Sie das Vorhandensein einer Datei oder eines Verzeichnisses nur mit Hilfe von integrierten Modulen überprüfen können.
Die Überprüfung, ob sich eine Datei oder ein Skript an der richtigen Stelle befindet, ist für jedes CLI-Programm entscheidend. Ihr Programm könnte unbrauchbar werden, wenn eine bestimmte Datei zum Zeitpunkt der Ausführung nicht vorhanden ist.
In der heutigen Anleitung lernen Sie einige schnelle Möglichkeiten kennen, um zu prüfen, ob eine Datei oder ein Ordner in Python existiert.
Vor dem Start
Vergewissern Sie sich, dass Sie Python 3 auf Ihrem System installiert haben, 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 2.x-Version haben, müssen Sie den Befehl “python3” verwenden. Schauen Sie sich unsere Python-Installationsanleitung an, wenn Sie Python 3 noch nicht installiert haben.
Da wir in diesem Tutorial einige Testdateien verwenden werden, sollten Sie die folgenden Dateien erstellen:
touch testfile.txt
mkdir testdirectory/
touch testverzeichnis/andereDatei.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 Ipython als unsere interaktive Python-Shell verwenden, die eine hübsche Oberfläche für die Arbeit bietet. Dies ist nur ein Hilfsmittel und daher nicht unbedingt erforderlich.
pip install ipython
Nachdem Sie dies getan haben, erhalten Sie Zugang zu einer schönen Python-Shell, indem Sie einfach ipython eintippen.
Nun sind Sie bereit und können prüfen, ob ein Ordner oder eine Datei in Python existiert.
Versuchen, Öffnen und Außer
Dies ist die einfachste Möglichkeit. Wenn Sie versuchen, eine Datei zu öffnen, die nicht existiert, gibt Python einen FileNotFoundError aus.
In <x><x><x><x><x><x>[1]</x></x></x></x></x></x>: open('im-nicht-hier.txt')
---------------------------------------------------------------------------
FileNotFoundError: [Errno 2] Keine solche Datei oder Verzeichnis: 'im-nicht-hier.txt'
Wir können dies ausnutzen und die Ausnahme behandeln, falls die gesuchte Datei nicht existiert.
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>: try:
...: file = open('im-nicht-hier.txt')
...: print(file) # Datei-Handler
...: file.close()
...: except FileNotFoundError:
...: print('Die gesuchte Datei existiert leider nicht')
...: exit()
...:
Die Datei, die wir suchen, existiert leider nicht
Im obigen Code geben wir eine benutzerdefinierte Meldung aus und brechen die Ausführung des Programms ab, wenn die Datei nicht existiert.
Beachten Sie, dass die Funktion exit() nur ausgeführt wird, wenn eine Ausnahme ausgelöst wird. Lassen Sie uns sehen, was passiert, wenn die gesuchte Datei tatsächlich existiert.
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>: try:
...: file = open('testdatei.txt')
...: print(file) # Datei-Handler
...: file.close()
...: except FileNotFoundError:
...: print('Die gesuchte Datei existiert leider nicht')
...: exit()
...:
<_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'>
Beachten Sie, dass wir die Datei gleich nach dem Öffnen wieder schließen. Laut der Python-Dokumentation ist dies eine gute Praxis.
Der Aufruf von
<span class="pre">file.write()</span>
ohne Verwendung des Schlüsselworts<span class="pre">with</span>
oder der Aufruf von<span class="pre">file.close()</span>
kann dazu führen, dass die Argumente von<span class="pre">file.write()</span>
nicht vollständig auf die Festplatte geschrieben werden, selbst wenn das Programm erfolgreich beendet wird.
Selbst wenn wir nicht in die Datei schreiben, ist es äußerst empfehlenswert, die Datei zu schließen, da dies zu zahlreichen Leistungsproblemen führen kann.
Wenn wir die Datei nicht selbst schließen wollen, können wir den with context manager verwenden. Er weist Ressourcen präzise zu und gibt sie wieder frei, so dass wir die Datei nicht schließen müssen.
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>: try:
...: with open('testfile.txt') as file:
...: print(datei)
...: # Die Datei muss nicht geschlossen werden
...: except FileNotFoundError:
...: print('Leider existiert die gesuchte Datei nicht')
...: exit()
...:
...:
<_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'>
Diese Methode ist sehr nützlich, wenn Sie in Dateien schreiben, aber sie ist ineffizient, wenn wir nur prüfen wollen, ob eine Datei existiert. Schauen wir uns andere Optionen an, um dies zu erreichen.
os.path.exists()
Das os-Modul bietet mehrere Funktionen zur Interaktion mit dem Betriebssystem. Um zu prüfen, ob eine Datei oder ein Ordner existiert, können wir die Funktion path.exists() verwenden, die den Pfad zur Datei oder zum Verzeichnis als Argument akzeptiert. Sie gibt einen booleschen Wert für die Existenz des Pfades zurück.
Hinweis: Ein Pfad ist die eindeutige Position einer Datei oder eines Verzeichnisses in einem Dateisystem
In Python enthält das Untermodul os.path Funktionen, die ausschließlich für den Umgang mit Dateipfaden bestimmt sind. Alle diese Funktionen akzeptieren das Pfadargument als Zeichenkette oder Byte, 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
# Das Skript in meinem Heimatordner ausführen
Hier sind mehrere Beispiele, die die Funktion os.path.exists() verwenden und in dem Verzeichnis ausgeführt werden, in dem sich meine Testdateien befinden:
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('testdatei.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
Wie Sie sehen können, wird True zurückgegeben, wenn Sie mit der Datei testfile.txt und dem Ordner testdirectory testen, und False, wenn die Datei nicht existiert.
os.path.isfile()
Wenn Sie nur die Existenz einer Datei (und nicht eines Verzeichnisses) nachweisen wollen, rufen Sie die Funktion os.path.isfile() auf.
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('testdatei.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('testverzeichnis/andere-datei.txt')
Out<x><x><x><x><x><x><x>[5]</x></x></x></x></x></x></x>: True
Hinweis: Unter UNIX enden alle Verzeichnisse mit einem Schrägstrich (/), während wir unter Windows einen umgekehrten Schrägstrich (\) verwenden.
Im obigen Code hat die Funktion isfile() zweimal False zurückgegeben, lassen Sie uns sehen warum:
testdirectory/
ist ein Verzeichnis, daher wird es nicht als Datei betrachtet. Das ist zwar 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 einen IsADirectoryError)i-dont-even-exist
verweist auf eine Datei, die ironischerweise nicht existiert
os.path.isdir()
Wenn Sie überprüfen wollen, ob ein Verzeichnis an der richtigen Stelle liegt, müssen Sie die Funktion os.path.isdir() verwenden, die nur True zurückgibt, wenn der angegebene Pfad auf ein Verzeichnis zeigt.
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('testdatei.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('andereDatei.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
Beachten Sie, dass die obigen Beispiele False zurückgeben, auch wenn der Pfad auf eine existierende Datei verweist.
Glob
Das Modul glob bietet Funktionen für die Arbeit mit Unix-Shell-ähnlichen Mustern (daher funktioniert es unter Windows nicht richtig). Um zu prüfen, ob eine Datei mit einem Muster im aktuellen Verzeichnis übereinstimmt, können Sie die Funktion glob.glob() verwenden.
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('testdatei.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>: ['testdatei.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']
Im obigen Code ist das an die Funktion glob übergebene Muster eine normale Zeichenkette, die den Pfad zur Testdatei und zum Testverzeichnis darstellt. Da beide Pfade existieren, gibt die Funktion eine Liste mit den übereinstimmenden Pfadnamen in ihr zurück.
Hinweis: Würde das Muster nicht übereinstimmen, würden Sie eine leere Liste erhalten.
Wenn man bedenkt, dass wir der Funktion glob Muster übergeben können, warum sollten wir nicht einige der wichtigsten Vorteile dieser Funktion testen?
Der folgende Code ermittelt alle Dateipfade mit der Erweiterung .txt bzw. .py:
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>: ['testdatei.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']
Verwendung der Path-Klasse
Die Path-Klasse ist eine der besten Möglichkeiten, um mit Pfaden zu arbeiten, da sie uns eine saubere Schnittstelle für die Arbeit mit Dateipfaden als Objekte bietet.
Das Tüpfelchen auf dem i ist, dass Path-Instanzen über alle Methoden verfügen, die Sie benötigen, um Informationen über einen bestimmten Pfad zu erhalten. Dazu gehören ähnliche Funktionalitäten wie bei den 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:
Prüfen, ob ein Pfad existiert
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('testdatei.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>: Pfad('im-nicht-hier.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
Funktioniert genauso wie os.path.exists().
Überprüfen Sie, ob der Pfad auf eine Datei zeigt
In <x><x><x><x><x><x><x>[5]</x></x></x></x></x></x></x>: Pfad('testdatei.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 zu os.path.isfile().
Prüfen, ob der Pfad auf ein Verzeichnis zeigt
In <x><x><x>[7]</x></x></x>: Pfad('testdatei.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
Entspricht os.path.isdir().
subprocess
Wenn Sie ein Liebhaber von subprocess-Modulen sind, müssen Sie diese Option kennen. Mit dem Befehl test können Sie feststellen, ob eine Datei oder ein Ordner existiert.
Hinweis: Der Befehl test funktioniert nur unter Unix.
Mit den folgenden Test-Flags können Sie die Arbeit erledigen:
- test -e: Prüfen, ob ein Pfad existiert
- test -f: Prüfen, ob eine Datei vorhanden ist
- test-d : Prüfen Sie, ob ein Ordner existiert
Wenn Sie mehr über die Test-Flags erfahren möchten, können Sie das Handbuch lesen, indem Sie
man test
Prüfen eines Pfades mit Unterprozess:
Der folgende Code ermittelt, ob ein Pfad existiert, indem er den Rückgabewert des Unterprozesses mit 0 vergleicht.
Denken Sie daran, dass unter Linux ein Prozess, wenn er gut gelaufen ist, Null zurückgibt, wenn nicht, einen beliebigen anderen 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
In der ersten Anweisung importieren wir das Modul subprocess, verwenden dann die Funktion run und erhalten ihren Rückgabewert.
Überprüfen der Existenz einer Datei mit 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
Überprüfen eines Verzeichnisses mit Unterprozess:
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
Es ist nicht empfehlenswert, diese Option zu verwenden, da sie mehr Ressourcen verbraucht und wir keinen Vorteil daraus ziehen können.
Zusammengefasst
Python ist eine der am häufigsten verwendeten Programmiersprachen, um Prozesse durch Interaktion mit dem Betriebssystem zu automatisieren. Eine coole Sache, die Sie damit machen können, ist zu prüfen, ob eine Datei oder ein Ordner existiert.
Die einfachsten Möglichkeiten dazu sind:
- Öffnen und sofortiges Behandeln von Dateiausnahmen
- Verwendung der Funktion exists() der Module os.path oder pathlib.
In diesem Lernprogramm haben Sie gelernt:
- Wie man eine Datei öffnet und Ausnahmen behandelt, wenn sie nicht existiert
- Die Bedeutung von Pfaden
- 3 verschiedene Funktionen, die das Submodul os.path zur Verfügung stellt, um die Existenz einer Datei oder eines Ordners zu überprüfen
- Unix verwendet Schrägstriche (/), während Windows umgekehrte Schrägstriche (\) verwendet
Lesen Sie weiter: Was ist ein Subprozess in Python? [5 Anwendungsbeispiele]