Wie überprüfe ich, ob eine Datei vorhanden ist oder nicht, ohne die try
Anweisung zu verwenden?
quelle
Wie überprüfe ich, ob eine Datei vorhanden ist oder nicht, ohne die try
Anweisung zu verwenden?
Wenn der Grund, den Sie überprüfen, darin besteht, dass Sie so etwas tun können if file_exists: open_it()
, ist es sicherer, ein try
um den Versuch herum zu verwenden, es zu öffnen. Beim Überprüfen und anschließenden Öffnen besteht die Gefahr, dass die Datei gelöscht oder verschoben wird oder zwischen dem Überprüfen und dem Versuch, sie zu öffnen.
Wenn Sie nicht vorhaben, die Datei sofort zu öffnen, können Sie sie verwenden os.path.isfile
Rückgabe,
True
wenn der Pfad eine vorhandene reguläre Datei ist. Dies folgt symbolischen Verknüpfungen, sodass sowohl islink () als auch isfile () für denselben Pfad wahr sein können.
import os.path
os.path.isfile(fname)
Wenn Sie sicher sein müssen, dass es sich um eine Datei handelt.
Ab Python 3.4 bietet das pathlib
Modul einen objektorientierten Ansatz (auf pathlib2
Python 2.7 zurückportiert):
from pathlib import Path
my_file = Path("/path/to/file")
if my_file.is_file():
# file exists
Gehen Sie wie folgt vor, um ein Verzeichnis zu überprüfen:
if my_file.is_dir():
# directory exists
Path
Verwenden Sie Folgendes, um zu überprüfen, ob ein Objekt unabhängig davon existiert, ob es sich um eine Datei oder ein Verzeichnis handelt exists()
:
if my_file.exists():
# path exists
Sie können auch resolve(strict=True)
in einem try
Block verwenden:
try:
my_abs_path = my_file.resolve(strict=True)
except FileNotFoundError:
# doesn't exist
else:
# exists
FileNotFoundError
in Python 3 eingeführt wurde. Wenn Sie neben Python 3 auch Python 2.7 unterstützen müssen, können SieIOError
stattdessen (welcheFileNotFoundError
Unterklassen) stackoverflow.com/a/21368457/1960959open('file', 'r+')
) öffnen und dann bis zum Ende suchen.Sie haben die
os.path.exists
Funktion:Dies gibt
True
sowohl für Dateien als auch für Verzeichnisse zurück, aber Sie können stattdessen verwendenum zu testen, ob es sich speziell um eine Datei handelt. Es folgen Symlinks.
quelle
Im Gegensatz zu
isfile()
,exists()
kehrtTrue
für Verzeichnisse. Je nachdem, ob Sie nur einfache Dateien oder auch Verzeichnisse möchten, verwenden Sieisfile()
oderexists()
. Hier ist eine einfache REPL-Ausgabe:quelle
quelle
Verwendung
os.path.isfile()
mitos.access()
:quelle
os.access()
wird false zurückgegeben.import os
, musst du nichtimport os.path
nochmal da es schon ein teil von istos
. Sie müssen nur importieren,os.path
wenn Sie nur Funktionen vonos.path
und nicht von sichos
selbst verwenden möchten, um eine kleinere Sache zu importieren. Wenn Sie jedochos.access
und verwendenos.R_OK
, wird der zweite Import nicht benötigt.quelle
Obwohl fast jeder mögliche Weg in (mindestens einer) der vorhandenen Antworten aufgeführt wurde (z. B. wurde Python 3.4- spezifisches Material hinzugefügt), werde ich versuchen, alles zusammenzufassen.
Hinweis : Jeder Teil des Python- Standardbibliothekscodes, den ich veröffentlichen werde, gehört zur Version 3.5.3 .
Problemstellung :
Mögliche Lösungen :
[Python 3]: os.path. existiert ( Pfad ) (auch andere Funktion Familienmitglieder überprüfen , wie
os.path.isfile
,os.path.isdir
,os.path.lexists
für etwas andere Verhaltensweisen)Alles gut, aber wenn Sie dem Importbaum folgen:
os.path
- posixpath.py ( ntpath.py )genericpath.py , Zeile ~ # 20 +
Es ist nur ein Try / Except- Block um [Python 3]: os. stat ( Pfad, *, dir_fd = Keine, follow_symlinks = True ) . Ihr Code ist also try / außer free, aber tiefer im Framestack befindet sich (mindestens) ein solcher Block. Dies gilt auch für andere Funktionen ( einschließlich
os.path.isfile
).1.1. [Python 3]: Pfad. is_file ()
Unter der Haube macht es genau das Gleiche ( pathlib.py , Zeile ~ # 1330 ):
[Python 3]: Mit Anweisungskontextmanagern . Entweder:
Erstelle einen:
Und seine Verwendung - Ich werde das
os.path.isfile
Verhalten replizieren (beachten Sie, dass dies nur zu Demonstrationszwecken dient, versuchen Sie nicht , solchen Code für die Produktion zu schreiben ):Verwenden Sie [Python 3]: contextlib. unterdrücken ( * Ausnahmen ) - wurde speziell zum selektiven Unterdrücken von Ausnahmen entwickelt
Aber sie scheinen Wrapper über try / exception / else / finally- Blöcke zu sein, wie in [Python 3] angegeben: Die with- Anweisung besagt:
Funktionen zum Durchlaufen des Dateisystems (und Durchsuchen der Ergebnisse nach übereinstimmenden Elementen)
[Python 3]: os. listdir ( path = '.' ) (oder [Python 3]: os. scandir ( path = '.' ) unter Python v 3.5 +, Backport: [PyPI]: scandir )
Unter der Haube verwenden beide:
über [GitHub]: python / cpython - (master) cpython / Modules / posixmodule.c
os.listdir
(os.scandir
sofern verfügbar)glob.glob
)os.listdir
Da diese Iterierte über Ordner (in den meisten Fällen) sie für unser Problem ineffizient sind (es gibt Ausnahmen, wie nicht wildcarded glob bing - wie @ShadowRanger wies darauf hin), so bin ich nicht auf sie los zu bestehen. Ganz zu schweigen davon, dass in einigen Fällen eine Dateinamenverarbeitung erforderlich sein kann.
[Python 3]: os. Zugang ( Pfad, Modus, *, dir_fd = None, effective_ids = False, follow_symlinks = True ) , dessen Verhalten in der Nähe
os.path.exists
(eigentlich ist es weiter, vor allem wegen des 2 nd Arguments)os.access("/tmp", os.F_OK)
Da ich in auch Arbeit C , verwende ich diese Methode als auch , weil unter der Haube, ruft es nativen API s (wieder über „$ {} PYTHON_SRC_DIR /Modules/posixmodule.c“ ), aber es eröffnet auch ein Tor für mögliche Benutzer Fehler , und es ist nicht so Python ic wie andere Varianten. Verwenden Sie es also, wie @AaronHall zu Recht betont hat, nur, wenn Sie wissen, was Sie tun:
Hinweis : Das Aufrufen nativer APIs ist auch über [Python 3] möglich: ctypes - Eine Fremdfunktionsbibliothek für Python , in den meisten Fällen jedoch komplizierter.
( Win- spezifisch): Da vcruntime * ( msvcr * ) .dll eine [MS.Docs] exportiert : _access, _waccess- Funktionsfamilie ebenfalls, hier ein Beispiel:
Anmerkungen :
os.F_OK
im Aufruf, aber das dient nur der Klarheit (der Wert ist 0 ).Das Gegenstück zu Lnx ( Ubtu (16 x 64) ):
Anmerkungen :
Statt hartzucodieren libc ‚s Pfad ( ‚/lib/x86_64-linux-gnu/libc.so.6‘ ) , die kann (und wahrscheinlich wird) über Systeme variieren, keine (oder die leere Zeichenkette) kann übergeben werden CDLL Konstruktor (
ctypes.CDLL(None).access(b"/tmp", os.F_OK)
). Nach [man7]: DLOPEN (3) :__declspec(dllexport)
(warum um alles in der Welt würde die normale Person das tun?), das Hauptprogramm ist ladbar, aber ziemlich unbrauchbarInstallieren Sie ein Modul eines Drittanbieters mit Dateisystemfunktionen
Wird sich höchstwahrscheinlich auf einen der oben genannten Wege stützen (möglicherweise mit geringfügigen Anpassungen).
Ein Beispiel wäre (wieder Win- spezifisch) [GitHub]: mhammond / pywin32 - Python für Windows (pywin32) Extensions , ein Python- Wrapper über WINAPIs .
Aber da dies eher eine Problemumgehung ist, höre ich hier auf.
Eine andere (lahme) Problemumgehung ( Gainarie ) ist (wie ich es gerne nenne) der Sysadmin- Ansatz: Verwenden Sie Python als Wrapper, um Shell-Befehle auszuführen
Gewinnen :
Nix ( Lnx ( Ubtu )):
Fazit :
Schlussbemerkung (en) :
quelle
glob.iglob
(undglob.glob
auch) basieren aufos.scandir
, also ist es jetzt faul; Um den ersten Treffer in einem Verzeichnis mit 10 Millionen Dateien zu erhalten, scannen Sie nur, bis Sie den ersten Treffer erreichen. Und selbst vor Version 3.6 istglob
die Funktion intelligent , wenn Sie Methoden ohne Platzhalter verwenden: Sie weiß, dass Sie nur einen Treffer erzielenos.path.isdir
os.path.lexists
können, und vereinfacht das Globbing auf nur oder (je nachdem, ob der Pfad endet/
).os.path.isdir
oderos.path.lexist
da es sich um eine Reihe von Funktionsaufrufen und Zeichenfolgen auf Python-Ebene handelt Operationen, bevor entschieden wird, dass der effiziente Pfad realisierbar ist, aber kein zusätzlicher Systemaufruf oder E / A-Arbeit (um Größenordnungen langsamer).Dies ist der einfachste Weg, um zu überprüfen, ob eine Datei vorhanden ist. Nur weil die Datei bei der Überprüfung vorhanden war, kann nicht garantiert werden, dass sie beim Öffnen vorhanden ist.
quelle
Python 3.4+ verfügt über ein objektorientiertes Pfadmodul : pathlib . Mit diesem neuen Modul können Sie überprüfen, ob eine Datei wie folgt vorhanden ist:
Sie können (und sollten normalerweise)
try/except
beim Öffnen von Dateien weiterhin einen Block verwenden:Das pathlib-Modul enthält viele coole Dinge: bequemes Globbing, Überprüfen des Dateibesitzers, einfacheres Verbinden von Pfaden usw. Es lohnt sich, es sich anzusehen. Wenn Sie mit einem älteren Python (Version 2.6 oder höher) arbeiten, können Sie pathlib weiterhin mit pip installieren:
Importieren Sie es dann wie folgt:
quelle
Bevorzugen Sie die try-Anweisung. Es gilt als besserer Stil und vermeidet Rennbedingungen.
Nimm mein Wort nicht dafür. Es gibt viel Unterstützung für diese Theorie. Hier ist ein paar:
quelle
try...except
hilft ohnehin nicht, dieses Problem zu lösen .except:
Klausel dazu führt, dass eine in diesem Teil Ihres Codes auftretende Ausnahme eine verwirrende Meldung auslöst (zweiter Fehler während die Verarbeitung des ersten.)Jetzt seit Python 3.4 verfügbar, importieren und instanziieren Sie ein
Path
Objekt mit dem Dateinamen und überprüfen Sie dieis_file
Methode (beachten Sie, dass dies True für Symlinks zurückgibt, die auch auf reguläre Dateien verweisen):Wenn Sie mit Python 2 arbeiten, können Sie das pathlib-Modul von pypi aus zurückportieren
pathlib2
oder auf andere Weiseisfile
vom Modul aus überprüfenos.path
:Das Obige ist hier wahrscheinlich die beste pragmatische direkte Antwort, aber es besteht die Möglichkeit einer Race-Bedingung (abhängig davon, was Sie erreichen möchten) und die Tatsache, dass die zugrunde liegende Implementierung a verwendet
try
, Python jedoch verwendettry
überall in ihrer Implementierung verwendet.Weil Python verwendet
try
überall verwendet wird, gibt es wirklich keinen Grund, eine Implementierung zu vermeiden, die es verwendet.Der Rest dieser Antwort versucht jedoch, diese Vorbehalte zu berücksichtigen.
Längere, viel pedantischere Antwort
Verwenden Sie das neue
Path
Objekt in Python 3.4pathlib
. Beachten Sie, dass dies.exists
nicht ganz richtig ist, da Verzeichnisse keine Dateien sind (außer im Unix-Sinne, dass alles eine Datei ist).Also müssen wir verwenden
is_file
:Hier ist die Hilfe zu
is_file
:Holen wir uns also eine Datei, von der wir wissen, dass sie eine Datei ist:
Standardmäßig wird
NamedTemporaryFile
die Datei beim Schließen gelöscht (und automatisch geschlossen, wenn keine weiteren Verweise darauf vorhanden sind).Wenn Sie sich vertiefen der Implementierung befassen, werden Sie feststellen, dass
is_file
Folgendes verwendet wirdtry
:Rennbedingungen: Warum wir es gerne versuchen
Wir mögen,
try
weil es Rennbedingungen vermeidet. Mittry
versuchen Sie einfach, Ihre Datei zu lesen, und erwarten, dass sie dort vorhanden ist. Wenn nicht, fangen Sie die Ausnahme ab und führen das Fallback-Verhalten aus, das sinnvoll ist.Wenn Sie überprüfen möchten, ob eine Datei vorhanden ist, bevor Sie versuchen, sie zu lesen, und Sie sie möglicherweise löschen und dann möglicherweise mehrere Threads oder Prozesse verwenden oder ein anderes Programm diese Datei kennt und sie löschen könnte, besteht die Gefahr, dass dies der Fall ist eine Rennbedingung wenn Sie überprüfen, ob sie vorhanden ist, weil Sie dann versuchen , sie vor ihrer Bedingung zu öffnen (ihre Existenz) ändert.
Die Rennbedingungen sind sehr schwer zu debuggen, da es ein sehr kleines Fenster gibt, in dem Ihr Programm fehlschlagen kann.
Aber wenn dies Ihre Motivation, Sie können Sie den Wert einer
try
Aussage mithilfe von ermittelnsuppress
Kontextmanagers ermitteln.Vermeiden Sie Rennbedingungen ohne eine Try-Anweisung:
suppress
Python 3.4 gibt uns den
suppress
Kontextmanager (früher derignore
Kontextmanager), der in weniger Zeilen semantisch genau dasselbe tut und gleichzeitig (zumindest oberflächlich) die ursprüngliche Aufforderung erfüllt, einetry
Aussage zu vermeiden :Verwendungszweck:
Für frühere Pythons könnten Sie Ihre eigenen würfeln
suppress
, aber ohne atry
wird es ausführlicher als mit. Ich glaube, dies ist tatsächlich die einzige Antwort, dietry
auf keiner Ebene in Python verwendet wird und auf die vor Python 3.4 angewendet werden kann, da stattdessen ein Kontextmanager verwendet wird:Vielleicht einfacher mit einem Versuch:
Andere Optionen, die die Frage nach "ohne Versuch" nicht erfüllen:
isfile
aus den Dokumenten :
Wenn Sie jedoch die Quelle dieser Funktion untersuchen, werden Sie feststellen, dass tatsächlich eine try-Anweisung verwendet wird:
Alles, was es tut, ist, den angegebenen Pfad zu verwenden, um zu sehen, ob Statistiken darauf abgerufen werden können, abzufangen
OSError
und dann zu überprüfen, ob es sich um eine Datei handelt, wenn die Ausnahme nicht ausgelöst wurde.Wenn Sie beabsichtigen, etwas mit der Datei zu tun, würde ich vorschlagen, es direkt mit einem Versuch zu versuchen - außer um eine Rennbedingung zu vermeiden:
os.access
Verfügbar für Unix und Windows ist
os.access
, aber um zu verwenden, müssen Sie Flags übergeben, und es wird nicht zwischen Dateien und Verzeichnissen unterschieden. Dies wird eher verwendet, um zu testen, ob der tatsächlich aufrufende Benutzer Zugriff in einer Umgebung mit erhöhten Berechtigungen hat:Es leidet auch unter den gleichen Problemen mit den Rennbedingungen wie
isfile
. Aus den Dokumenten :Vermeide das Benutzen
os.access
. Es handelt sich um eine Funktion auf niedriger Ebene, die mehr Möglichkeiten für Benutzerfehler bietet als die oben diskutierten Objekte und Funktionen auf höherer Ebene.Kritik an einer anderen Antwort:
Eine andere Antwort sagt dies über
os.access
:Diese Antwort besagt, dass eine nicht pythonische, fehleranfällige Methode ohne Rechtfertigung bevorzugt wird. Es scheint Benutzer zu ermutigen, APIs auf niedriger Ebene zu verwenden, ohne sie zu verstehen.
Außerdem wird ein Kontextmanager erstellt, der durch bedingungslose Rückgabe
True
alle Ausnahmen (einschließlichKeyboardInterrupt
undSystemExit
!) Im Stillen passieren lässt. Dies ist eine gute Möglichkeit, Fehler zu verbergen.Dies scheint die Benutzer zu ermutigen, schlechte Praktiken anzuwenden.
quelle
Das Importieren
os
erleichtert das Navigieren und Ausführen von Standardaktionen mit Ihrem Betriebssystem.Als Referenz siehe auch Überprüfen, ob eine Datei mit Python vorhanden ist.
Wenn Sie Operationen auf hoher Ebene benötigen, verwenden Sie
shutil
.quelle
os.path.exists
Gibt true für Dinge zurück, die keine Dateien sind, z. B. Verzeichnisse. Dies ergibt falsch positive Ergebnisse. Siehe die anderen Antworten, die empfehlenos.path.isfile
.Testen auf Dateien und Ordner mit
os.path.isfile()
,os.path.isdir()
undos.path.exists()
Unter der Annahme, dass der "Pfad" ein gültiger Pfad ist, zeigt diese Tabelle, was von jeder Funktion für Dateien und Ordner zurückgegeben wird:
Sie können auch testen, ob eine Datei ein bestimmter Dateityp ist
os.path.splitext()
, um die Erweiterung zu erhalten (falls Sie sie noch nicht kennen).quelle
Im Jahr 2016 ist der beste Weg immer noch
os.path.isfile
:Oder in Python 3 können Sie Folgendes verwenden
pathlib
:quelle
pathlib
ist die OOP-Lösung von Python für Pfade. Sie können viel mehr damit machen. Wenn Sie nur die Existenz überprüfen müssen, ist der Vorteil nicht so groß.Es scheint nicht so, als gäbe es einen bedeutenden funktionalen Unterschied zwischen try / without und
isfile()
, also sollten Sie verwenden, welches sinnvoll ist.Wenn Sie eine Datei lesen möchten, falls vorhanden, tun Sie dies
Wenn Sie eine Datei jedoch nur umbenennen möchten, wenn sie vorhanden ist, und sie daher nicht öffnen müssen, tun Sie dies
Wenn Sie in eine Datei schreiben möchten, falls diese nicht vorhanden ist, tun Sie dies
Wenn Sie eine Dateisperrung benötigen, ist das eine andere Sache.
quelle
os.path.exists
Gibt true für Dinge zurück, die keine Dateien sind, z. B. Verzeichnisse. Dies ergibt falsch positive Ergebnisse. Siehe die anderen Antworten, die empfehlenos.path.isfile
.filepath
mit dem richtigen Timing, und BAM überschreibt die Zieldatei. Sie sollten diesopen(filepath, 'wx')
in einemtry...except
Block tun , um das Problem zu vermeiden.OSError
fallsfilepath + '.old'
bereits vorhanden: "Unter Windows wird, wenn dst bereits vorhanden ist, OSError ausgelöst, auch wenn es sich um eine Datei handelt. Es gibt möglicherweise keine Möglichkeit, eine atomare Umbenennung bei dst zu implementieren benennt eine vorhandene Datei. "os.replace
Zieldatei portabel stumm ersetzt (identisch mitos.rename
dem Linux-Verhalten) (es treten nur Fehler auf, wenn der Zielname vorhanden ist und ein Verzeichnis ist). Sie stecken also auf 2.x fest, aber Py3-Benutzer haben seit einigen Jahren eine gute Option.rename
Beispiel: Es sollte immer noch mittry
/ gemacht werdenexcept
.os.rename
(oderos.replace
auf modernem Python) ist atomar; Wenn Sie es überprüfen und dann umbenennen, werden unnötige Rennen und zusätzliche Systemaufrufe ausgeführt. Tuntry: os.replace(filepath, filepath + '.old') except OSError: pass
Sie könnten dies versuchen (sicherer):
Die Ausgabe wäre:
Abhängig vom Ergebnis kann Ihr Programm dann einfach von dort aus weiter ausgeführt werden, oder Sie können Code verwenden, um es zu stoppen, wenn Sie möchten.
quelle
try
Obwohl ich immer die Verwendung von
try
undexcept
Aussagen empfehle , sind hier einige Möglichkeiten für Sie (mein persönlicher Favorit ist die Verwendungos.access
):Versuchen Sie, die Datei zu öffnen:
Durch das Öffnen der Datei wird immer die Existenz der Datei überprüft. Sie können eine Funktion wie folgt erstellen:
Wenn es falsch ist, wird die Ausführung mit einem nicht übergebenen IOError oder OSError in späteren Versionen von Python gestoppt. Um die Ausnahme abzufangen, müssen Sie eine try Except-Klausel verwenden. Natürlich können Sie immer eine
try
Ausnahme-Anweisung wie diese verwenden (danke an hsandt , der mich zum Nachdenken gebracht hat):Verwendung
os.path.exists(path)
:Dadurch wird die Existenz Ihrer Angaben überprüft. Es wird jedoch nach Dateien und Verzeichnissen gesucht. Achten Sie daher darauf, wie Sie es verwenden.
Verwendung
os.access(path, mode)
:Dadurch wird geprüft, ob Sie Zugriff auf die Datei haben. Es wird nach Berechtigungen gesucht. Basierend auf der os.py-Dokumentation wird beim Eingeben
os.F_OK
die Existenz des Pfads überprüft. Wenn Sie dies verwenden, entsteht jedoch eine Sicherheitslücke, da jemand Ihre Datei in der Zeit zwischen dem Überprüfen der Berechtigungen und dem Öffnen der Datei angreifen kann. Sie sollten stattdessen direkt zum Öffnen der Datei gehen, anstatt deren Berechtigungen zu überprüfen. ( EAFP gegen LBYP ). Wenn Sie die Datei anschließend nicht öffnen und nur ihre Existenz überprüfen möchten, können Sie diese verwenden.Wie auch immer, hier:
Ich sollte auch erwähnen, dass es zwei Möglichkeiten gibt, wie Sie die Existenz einer Datei nicht überprüfen können. Entweder wird das Problem sein
permission denied
oderno such file or directory
. Wenn Sie eine fangenIOError
, setzen Sie dieIOError as e
(wie meine erste Option) und geben Sie sie ein ,print(e.args)
damit Sie hoffentlich Ihr Problem feststellen können. Ich hoffe, es hilft! :) :)quelle
Datum: 2017-12-04
Jede mögliche Lösung wurde in anderen Antworten aufgeführt.
Eine intuitive und streitbare Möglichkeit, um zu überprüfen, ob eine Datei vorhanden ist, ist die folgende:
Ich habe ein ausführliches Cheatsheet als Referenz erstellt:
quelle
Wenn die Datei geöffnet werden soll, können Sie eine der folgenden Techniken verwenden:
AKTUALISIEREN
Um Verwirrung zu vermeiden und basierend auf den Antworten, die ich erhalten habe, findet die aktuelle Antwort entweder eine Datei oder ein Verzeichnis mit dem angegebenen Namen.
quelle
os.path.exists
Gibt true für Dinge zurück, die keine Dateien sind, z. B. Verzeichnisse. Dies ergibt falsch positive Ergebnisse. Siehe die anderen Antworten, die empfehlenos.path.isfile
.Zusätzlich
os.access()
:Sein
R_OK
,W_OK
undX_OK
die Flags zum Testen auf Berechtigungen ( doc ).quelle
SRC: http://www.pfinn.net/python-check-if-file-exists.html
quelle
Wenn Sie NumPy bereits für andere Zwecke importiert dann gibt es keine Notwendigkeit, andere Bibliotheken zu importieren wie
pathlib
,os
,paths
usw.Dies wird basierend auf seiner Existenz wahr oder falsch zurückgeben.
quelle
Sie können Brians Vorschlag ohne die schreiben
try:
.suppress
ist Teil von Python 3.4. In älteren Releases können Sie schnell Ihre eigene Unterdrückung schreiben:quelle
Ich bin der Autor eines Pakets, das es seit ungefähr 10 Jahren gibt, und es hat eine Funktion, die diese Frage direkt anspricht. Wenn Sie sich auf einem Nicht-Windows-System befinden, wird
Popen
der Zugriff verwendetfind
. Wenn Sie jedoch unter Windows arbeiten, wird es repliziertfind
mit einem effizienten Dateisystem-Walker .Der Code selbst verwendet keinen
try
Block… außer um das Betriebssystem zu bestimmen und Sie so zum "Unix" -Stilfind
oder zum Hand-Buillt zu führenfind
. Timing-Tests zeigten, dass dastry
Betriebssystem schneller ermittelt werden konnte, daher habe ich dort eines verwendet (aber nirgendwo anders).Und der Doc ...
Die Implementierung finden Sie hier: https://github.com/uqfoundation/pox/blob/89f90fb308f285ca7a62eabe2c38acb87e89dad9/pox/shutils.py#L190
quelle
Überprüfen Sie, ob eine Datei oder ein Verzeichnis vorhanden ist
Sie können diesen drei Möglichkeiten folgen:
quelle
Hinzufügen einer weiteren geringfügigen Variation, die sich in den anderen Antworten nicht genau widerspiegelt.
Dies behandelt den Fall des
file_path
SeinsNone
oder der leeren Zeichenfolge.Hinzufügen einer Variante auf Vorschlag von Shahbaz
Hinzufügen einer Variante auf Vorschlag von Peter Wood
quelle
if (x) return true; else return false;
ist wirklich gerechtreturn x
. Ihre letzten vier Zeilen können werdenreturn os.path.isfile(file_path)
. Während wir gerade dabei sind, kann die gesamte Funktion als vereinfacht werdenreturn file_path and os.path.isfile(file_path)
.return x
im Fall von vorsichtig seinif (x)
. Python betrachtet eine leere Zeichenfolge als falsch. In diesem Fall würden wir eine leere Zeichenfolge anstelle eines Bools zurückgeben. Der Zweck dieser Funktion ist es, immer bool zurückzugeben.x
istos.path.isfile(..)
es jedoch so, dass es schon bool ist.os.path.isfile(None)
löst eine Ausnahme aus, weshalb ich den if-Check hinzugefügt habe. Ich könnte es wahrscheinlich einfach in einen Versuch einwickeln / außer stattdessen, aber ich fand, dass es auf diese Weise expliziter war.return file_path and os.path.isfile(file_path)
Hier ist ein 1-zeiliger Python-Befehl für die Linux-Befehlszeilenumgebung. Ich finde das SEHR HANDY, da ich kein so heißer Bash-Typ bin.
Ich hoffe das ist hilfreich.
quelle
[ -f "${file}" ] && echo "file found" || echo "file not found"
(entsprichtif [ ... ]; then ...; else ...; fi
).Sie können die "OS" -Bibliothek von Python verwenden:
quelle
os.path.exists
Gibt true für Dinge zurück, die keine Dateien sind, z. B. Verzeichnisse. Dies ergibt falsch positive Ergebnisse. Siehe die anderen Antworten, die empfehlenos.path.isfile
.exists
ist dies in Ordnung. Wenn das Ziel darin besteht, festzustellen, ob es sicher ist, eine vermutlich vorhandene Datei zu öffnen, ist die Kritik berechtigt und nicht präzise genug. Leider gibt das OP nicht an, welches das gewünschte Ziel ist (und wird dies wahrscheinlich nicht mehr tun).Im Jahr 2016 ist dies wohl immer noch der einfachste Weg, um zu überprüfen, ob sowohl eine Datei vorhanden ist als auch ob es sich um eine Datei handelt:
isfile
ist eigentlich nur eine Hilfsmethode, die internos.stat
undstat.S_ISREG(mode)
darunter verwendet wird. Diesos.stat
ist eine untergeordnete Methode, mit der Sie detaillierte Informationen zu Dateien, Verzeichnissen, Sockets, Puffern und mehr erhalten. Mehr über os.stat hierHinweis: Dieser Ansatz sperrt die Datei jedoch in keiner Weise und daher kann Ihr Code anfällig für TOCTTOU- Fehler ( Time of Check to Time of Use ) werden.
Das Auslösen von Ausnahmen wird daher als akzeptabler und pythonischer Ansatz für die Flusskontrolle in Ihrem Programm angesehen. Und man sollte in Betracht ziehen, fehlende Dateien mit IOErrors zu behandeln, anstatt
if
Anweisungen ( nur ein Ratschlag ).quelle
quelle
isReadableFile(path,fileName)
wird zurückgegeben,True
wenn die Datei vom Prozess \ program \ thread