• Erledigen Sie die Anwendungssicherheit auf die richtige Weise! Erkennen, schützen, überwachen, beschleunigen und mehr…
  • 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, um das Vorhandensein einer Datei oder eines Verzeichnisses nur mit integrierten Modulen zu überprüfen.

    Prüfen, ob eine Datei oder Skript an der richtigen Stelle ist, ist für jedes CLI-Programm entscheidend. Ihr Programm könnte nutzlos werden, wenn eine bestimmte Datei zum Zeitpunkt der Ausführung nicht vorhanden ist.

    Im heutigen Tutorial erfahren Sie, wie Sie schnell überprüfen können, 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 in 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. Schauen Sie sich unsere Python-Installationsanleitung wenn Sie Python 3 nicht installiert haben.

    Wir werden zusammen mit diesem Tutorial einige Testdateien verwenden, also stellen Sie 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 im Testverzeichnis. 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 eingeben python.

    Interaktive Ipython-Shell mit Python 3.9

    Jetzt sind Sie bereit, um zu überprüfen, ob ein Ordner oder eine Datei in Python vorhanden ist.

    Versuchen, öffnen und außer Open

    Dies ist die einfachste Option. Wenn Sie versuchen, eine Datei zu öffnen, die nicht existiert, löst Python a . 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 gesuchte Datei 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, wie die Ausfahrt() Funktion wird nur ausgeführt, wenn eine Ausnahme ausgelöst wird. Sehen wir uns an, 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.

    anrufen <span class="pre">file.write()</span> ohne die <span class="pre">with</span> Stichwort oder Berufung <span class="pre">file.close()</span> könnte ergeben die Argumente von <span class="pre">file.write()</span> nicht vollständig auf die Festplatte geschrieben wird, 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 zu mehrere Leistungsprobleme.

    Wenn wir die Datei nicht selbst schließen möchten, können wir die mit Kontext-Manager. 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 beim Schreiben in Dateien äußerst nützlich, 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 bietet mehrere Funktionen zur Interaktion mit dem Betriebssystem. Um zu überprüfen, ob eine Datei oder ein Ordner vorhanden ist, können wir die Pfad.existiert () Funktion, die den Pfad zur Datei oder zum Verzeichnis als Argument akzeptiert. Es gibt einen booleschen Wert zurück, der auf der Existenz des Pfads basiert.

    Hinweis: Ein Pfad ist die eindeutige Position einer Datei oder eines Verzeichnisses in einem Dateisystem

    In Python ist das os.pfad Das Submodul enthält Funktionen, die ausschließlich für den Betrieb mit Dateipfaden entwickelt wurden. Alle diese Funktionen akzeptieren das Pfadargument als Strings oder Bytes, und Sie können beispielsweise mit absoluten Pfaden arbeiten:

    /home/daniel/.bashrc

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

    .bashrc
    # Running the script in my home folder

    Hier sind mehrere Beispiele mit der os.path.exists() Funktion, 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, kehrt es zurück Wahr beim Testen mit dem testdatei.txt Datei und die Testverzeichnis Ordner und falsch wenn die Datei nicht existiert.

    os.pfad.isfile()

    Wollte man nur die Existenz einer Datei (kein Verzeichnisses) nachweisen, würde man die os.pfad.isfile() Funktion.

    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: Unter UNIX enden alle Verzeichnisse mit einem Schrägstrich (/), während wir in Windows einen umgekehrten Schrägstrich (\) verwenden.

    Im Code über dem isfile() Funktion zurück falsch Lassen Sie uns bei zwei Gelegenheiten sehen, warum:

    • testdirectory/ ist ein Verzeichnis und wird daher nicht als Datei betrachtet. Dies ist nicht absolut wahr, da in Linux alles ist ein Dateideskriptor, aber Python behandelt Verzeichnisse aus Bequemlichkeitsgründen anders (Wenn Sie versuchen, ein Verzeichnis zu öffnen, erhalten Sie eine IsADirectoryError)
    • i-dont-even-exist verweist auf eine Datei, die ironischerweise nicht existiert

    os.pfad.isdir()

    Wenn Sie überprüfen möchten, ob sich ein Verzeichnis an der richtigen Stelle befindet, müssen Sie die os.pfad.isdir() Funktion, die nur zurückgibt Wahr 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, wie die obigen Beispiele zurückkehren falsch selbst wenn der Pfad auf eine vorhandene Datei verweist.

    Klümpchen

    Das Klacks Modul bietet Funktionen zum Arbeiten Unix-Muschel-ä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 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 passenden 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 testen Sie nicht einige der Hauptvorteile davon?

    Der folgende Code erhält alle Dateipfade mit einer Erweiterung .txt und .py beziehungsweise:

    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 Pfadklasse ist eine der besten Möglichkeiten, um mit Pfaden zu arbeiten, da sie uns eine saubere Schnittstelle bietet, um mit Dateipfaden als Objekten zu arbeiten.

    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 existiert

    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
    

    Gleichwertig os.pfad.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 Unterprozessmodul Liebhaber, Sie müssen über diese Option Bescheid wissen. Sie können feststellen, ob eine Datei oder ein Ordner vorhanden ist, indem Sie die Testbefehl.

    Hinweis: Das Test Befehl funktioniert nur unter Unix.

    Die folgenden Test-Flags werden die Aufgabe erledigen:

    • test -e: Überprüfen Sie, ob ein Pfad existiert
    • testen -f: Überprüfen Sie, ob eine Datei vorhanden ist
    • test-d: Überprüfen Sie, ob ein Ordner vorhanden ist

    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 existiert, indem er den Rückgabecode des Unterprozesses mit 0 vergleicht.

    Denken Sie daran, dass ein Prozess unter Linux Null zurückgibt, wenn er gut gelaufen ist, andernfalls wird jeder andere 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 seinen Rückkehrcode abrufen.

    Überprüfen der Existenz einer Datei mit subprocess

    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 eines der am häufigsten verwendeten Programmiersprachen Prozesse durch Interaktion mit dem Betriebssystem zu automatisieren. Eine coole Sache, die Sie damit machen können, ist zu überprüfen, ob eine Datei oder ein Ordner vorhanden ist.

    Am einfachsten geht das:

    • Dateiausnahmen sofort öffnen und behandeln
    • Verwendung der existiert () Funktion des os.pfad or Pfadlib Module.

    In diesem Tutorial haben Sie gelernt:

    • So öffnen Sie eine Datei und behandeln Ausnahmen, falls sie nicht existiert
    • Die Bedeutung von Wegen
    • 3 verschiedene Funktionen die os.pfad Submodul bietet die Möglichkeit, die Existenz einer Datei oder eines Ordners zu überprüfen
    • Unix verwendet Schrägstriche (/), während Windows umgekehrte Schrägstriche (\) verwendet.

    Weiter lesen: Was ist ein Unterprozess in Python? [5 Verwendungsbeispiele]