Wie prüfe ich, ob eine Datei existiert oder nicht, ohne die try
Aussage?
Einzeilige Prüfung in der Bash: [ -f "${file}" ] && echo "file found" || echo "file not found"
(was dasselbe ist wie if [ ... ]; then ...; else ...; fi
).
Wie prüfe ich, ob eine Datei existiert oder nicht, ohne die try
Aussage?
Einzeilige Prüfung in der Bash: [ -f "${file}" ] && echo "file found" || echo "file not found"
(was dasselbe ist wie if [ ... ]; then ...; else ...; fi
).
Ich bin der Autor eines Pakets, das es seit etwa 10 Jahren gibt, und es hat eine Funktion, die diese Frage direkt angeht. Wenn Sie auf einem Nicht-Windows-System arbeiten, verwendet es im Grunde genommen Popen
zum Zugang find
. Wenn Sie jedoch mit Windows arbeiten, wird Folgendes repliziert find
mit einem effizienten Dateisystem-Walker.
Der Code selbst verwendet keine try
Blocks außer bei der Bestimmung des Betriebssystems und damit bei der Lenkung auf den "Unix"-Stil find
oder das handgefertigte find
. Timing-Tests zeigten, dass die try
war schneller bei der Bestimmung des Betriebssystems, also habe ich es dort verwendet (aber nirgendwo sonst).
>>> import pox
>>> pox.find('*python*', type='file', root=pox.homedir(), recurse=False)
['/Users/mmckerns/.python']
Und der Doktor
>>> print pox.find.__doc__
find(patterns[,root,recurse,type]); Get path to a file or directory
patterns: name or partial name string of items to search for
root: path string of top-level directory to search
recurse: if True, recurse down from root directory
type: item filter; one of {None, file, dir, link, socket, block, char}
verbose: if True, be a little verbose about the search
On some OS, recursion can be specified by recursion depth (an integer).
patterns can be specified with basic pattern matching. Additionally,
multiple patterns can be specified by splitting patterns with a ';'
For example:
>>> find('pox*', root='..')
['/Users/foo/pox/pox', '/Users/foo/pox/scripts/pox_launcher.py']
>>> find('*shutils*;*init*')
['/Users/foo/pox/pox/shutils.py', '/Users/foo/pox/pox/__init__.py']
>>>
Die Umsetzung finden Sie hier, wenn Sie sich dafür interessieren: https://github.com/uqfoundation/pox/blob/89f90fb308f285ca7a62eabe2c38acb87e89dad9/pox/shutils.py#L190
Ich füge noch eine weitere kleine Variante hinzu, die in den anderen Antworten nicht genau wiedergegeben ist.
Damit wird der Fall der file_path
unter None
oder leere Zeichenfolge.
def file_exists(file_path):
if not file_path:
return False
elif not os.path.isfile(file_path):
return False
else:
return True
Hinzufügung einer Variante auf der Grundlage eines Vorschlags von Shahbaz
def file_exists(file_path):
if not file_path:
return False
else:
return os.path.isfile(file_path)
Hinzufügung einer Variante auf der Grundlage eines Vorschlags von Peter Wood
def file_exists(file_path):
return file_path and os.path.isfile(file_path):
if (x) return true; else return false;
ist eigentlich nur return x
. Ihre letzten vier Zeilen können zu return os.path.isfile(file_path)
. Wenn wir schon dabei sind, kann die gesamte Funktion wie folgt vereinfacht werden return file_path and os.path.isfile(file_path)
.
Sie müssen vorsichtig sein mit return x
im Falle von if (x)
. Python betrachtet eine leere Zeichenkette als False. In diesem Fall würden wir eine leere Zeichenkette statt eines bool zurückgeben. Der Zweck dieser Funktion ist es, immer bool zurückzugeben.
Wie prüfe ich, ob eine Datei existiert, ohne die try-Anweisung zu verwenden?
Im Jahr 2016 ist dies wohl immer noch der einfachste Weg, um zu prüfen, ob eine Datei existiert und ob sie eine Datei ist:
import os
os.path.isfile('./file.txt') # Returns True if exists, else False
isfile
ist eigentlich nur eine Hilfsmethode, die intern die os.stat
y stat.S_ISREG(mode)
darunter. Diese os.stat
ist eine Methode auf niedrigerer Ebene, die Ihnen detaillierte Informationen über Dateien, Verzeichnisse, Sockets, Puffer und mehr liefert. Mehr über os.stat hier
Nota: Bei diesem Ansatz wird die Datei jedoch in keiner Weise gesperrt, und Ihr Code kann daher anfällig für " Zeitpunkt der Kontrolle bis zum Zeitpunkt der Verwendung " ( TOCTTOU ) Ungeziefer.
Das Auslösen von Ausnahmen wird also 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
Aussagen ( nur ein Ratschlag ).
Diese Antwort ist falsch. os.path.exists
liefert true für Dinge, die keine Dateien sind, wie z. B. Verzeichnisse. Dies führt zu falsch positiven Ergebnissen. Siehe die anderen Antworten, die empfehlen os.path.isfile
.
@Chris Johnson , die Funktion os.path.exists() prüft, ob ein Pfad im System existiert. PATH kann ein VERZEICHNIS oder eine DATEI sein. Sie funktioniert in beiden Fällen einwandfrei. Bitte versuchen Sie es mit einem Beispiel
Diese Antwort funktioniert also. Großartig. Iff der Pfad ist nicht der einer Datei. Ging es darum in der Frage? Nein.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
16 Stimmen
Um zu prüfen, ob ein Path-Objekt existiert, unabhängig davon, ob es sich um eine Datei oder ein Verzeichnis handelt, verwenden Sie
my_path.exists()
.1 Stimmen
my_path.exists()
ist nicht ausreichend.my_path.is_file()
wird Ihnen sagen, ob es sich um eine Datei handelt (könnte zum Lesen gut sein). Aber wenn Sie die Datei erstellen wollen, müssen Sie auch prüfenexists
schließen Sie also Verzeichnisse oder andere Dinge im Dateisystem, die keine Dateien sind, aus, die den Fehler verursachen.0 Stimmen
Verwenden Sie os.path.isfile, um nur Dateien zu prüfen, und verwenden Sie os.path.exists, um sowohl Dateien als auch Verzeichnisse zu prüfen. Mehr dazu erfahren Sie hier: shortbuzz.in/blog/shortbuzz.in/