7118 Stimmen

Wie kann ich überprüfen, ob eine Datei ohne Ausnahmen existiert?

Wie prüfe ich, ob eine Datei existiert oder nicht, ohne die try Aussage?

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üfen exists 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/

19voto

Hier ist ein 1-Zeilen-Python-Befehl für die Linux-Kommandozeilenumgebung. Ich finde das SEHR HÄNDLICH, da ich nicht so ein großer Bash-Typ bin.

python -c "import os.path; print os.path.isfile('/path_to/file.xxx')"

Ich hoffe, dies ist hilfreich.

9 Stimmen

Einzeilige Prüfung in der Bash: [ -f "${file}" ] && echo "file found" || echo "file not found" (was dasselbe ist wie if [ ... ]; then ...; else ...; fi ).

2 Stimmen

Python wäre für diese Aufgabe in der Kommandozeile das völlig falsche Werkzeug.

0 Stimmen

Hallo @ruohola :) Da bin ich anderer Meinung.

19voto

Mike McKerns Punkte 30236

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

17voto

Marcel Wilson Punkte 3194

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):

4 Stimmen

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) .

0 Stimmen

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.

1 Stimmen

Das stimmt. In diesem Fall jedoch, x es os.path.isfile(..) also ist es bereits bool.

15voto

Taufiq Rahman Punkte 5386

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 ).

14voto

Pradip Das Punkte 732

Sie können die "OS"-Bibliothek von Python verwenden:

>>> import os
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.txt") 
True
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.tx")
False

6 Stimmen

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 .

0 Stimmen

@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

0 Stimmen

Diese Antwort funktioniert also. Großartig. Iff der Pfad ist nicht der einer Datei. Ging es darum in der Frage? Nein.

CodeJaeger.com

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.

Powered by:

X