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 testdirectory/otherfile.txt
Die obigen Befehle erstellen eine Datei zum Spielen, ein Testverzeichnis und eine weitere Datei innerhalb des Testverzeichnisse. 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
Jetzt sind Sie bereit, und wir 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-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 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) # File handler
...: file.close()
...: except FileNotFoundError:
....: print('Leider existiert die gesuchte Datei nicht')
...: exit()
...:
Leider existiert die gesuchte Datei
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('testfile.txt')
...: print(file) # File 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 mit 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(file)
...: # Die Datei muss nicht geschlossen werden
...: 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 sehr nützlich, wenn Sie in Dateien schreiben, aber sie ist ineffizient, wenn Sie 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 Pfad.existiert() 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.pfad 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
# Ich führe das Skript in meinem Heimatordner
aus
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('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
Wie Sie sehen, wird Wahr zurückgegeben, wenn Sie mit der Datei testdatei.txt und dem Ordner testdirectory testen, und Falsch, wenn die Datei nicht existiert
os.path.isfile()
Wenn Sie nur die Existenz einer Datei (und nicht eines Verzeichnisses) nachweisen möchten, 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('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
Hinweis: Unter UNIX enden alle Verzeichnisse mit einem Schrägstrich (/), während wir unter Windows einen Backslash (\) verwenden.
Im obigen Code hat die Funktion isfile() zweimal Falsch 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 ist ein DateideskriptorAber Python behandelt Verzeichnisse der Einfachheit halbwegs 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 Wahr zurückgibt, wenn der angegebene Pfad auf einem 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('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
Beachten Sie, dass die obigen Beispiele Falsch zurückgeben, auch wenn der Pfad auf eine existierende Datei verweist
Globus
Das Modul Globus 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 innerhalb des aktuellen Verzeichnisses ü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('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']
Im obigen Code ist das an die Funktion global ü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 zurück.
Hinweis: Wenn das Muster nicht übereinstimmt, erhalten Sie eine leere Liste
Wenn man bedenkt, dass wir der globalen Funktion 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>: ['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']
Verwendung der Path-Klasse
Die Pfad-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 Pfad-Instanzen über alle Methoden verfügen, die Sie benötigen, um Informationen über einen bestimmten Pfad zu erhalten. Dazu gehören ähnliche Funktionen 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 Sie, 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('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
Funktioniert genauso wie os.path.exists()
Prü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>: 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 zu os.path.isfile()
Prüfen Sie, ob der Pfad auf ein Verzeichnis zeigt
In <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
Entspricht os.path.isdir()
Unterprozess
Wenn Sie ein Liebhaber von Unterprozess-Module 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 Sie, ob ein Pfad existiert
- test -f: Prüfen Sie, ob eine Datei vorhanden ist
- test-d : Prüfen Sie, ob ein Ordner vorhanden ist
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 stellt fest, 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 laufen und erhalten ihren Rückgabewert
Überprüfen Sie die 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 einem 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 sofortige Behandlung von Dateiausnahmen
- Verwendung der Funktion existiert() das Modul os.pfad 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.pfad 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]