671 Stimmen

Der pythonischste Weg, eine Datei zu löschen, die möglicherweise nicht existiert

Ich möchte die Datei löschen filename wenn sie existiert. Ist es richtig zu sagen

if os.path.exists(filename):
    os.remove(filename)

Gibt es einen besseren Weg? Eine einzeilige Methode?

826voto

Matt Punkte 19922

Ein pythonischerer Weg wäre:

try:
    os.remove(filename)
except OSError:
    pass

Obwohl dies noch mehr Zeilen in Anspruch nimmt und sehr hässlich aussieht, vermeidet es den unnötigen Aufruf von os.path.exists() und folgt der Python-Konvention, Ausnahmen übermäßig zu verwenden.

Es kann sich lohnen, eine Funktion zu schreiben, die dies für Sie erledigt:

import os, errno

def silentremove(filename):
    try:
        os.remove(filename)
    except OSError as e: # this would be "except OSError, e:" before Python 2.6
        if e.errno != errno.ENOENT: # errno.ENOENT = no such file or directory
            raise # re-raise exception if a different error occurred

278voto

Kevin Punkte 27151

Ich ziehe es vor, eine Ausnahme zu unterdrücken, anstatt zu prüfen, ob die Datei vorhanden ist, um eine TOCTTOU Fehler. Matts Antwort ist ein gutes Beispiel dafür, aber wir können es unter Python 3 etwas vereinfachen, indem wir contextlib.suppress() :

import contextlib

with contextlib.suppress(FileNotFoundError):
    os.remove(filename)

Si filename ist eine pathlib.Path Objekts anstelle einer Zeichenkette, können wir dessen .unlink() Methode anstelle der Verwendung von os.remove() . Meiner Erfahrung nach sind Path-Objekte für die Manipulation des Dateisystems nützlicher als Strings.

Da alles in dieser Antwort nur für Python 3 gilt, ist dies ein weiterer Grund für ein Upgrade.

144voto

wkeithvan Punkte 1528

Ab Python 3.8 können Sie missing_ok=True y pathlib.Path.unlink ( Dokumente hier )

from pathlib import Path

my_file = Path("./dir1/dir2/file.txt")

# Python 3.8+
my_file.unlink(missing_ok=True)

# Python 3.7 and earlier
if my_file.exists():
    my_file.unlink()

58voto

abought Punkte 2612

os.path.exists gibt zurück. True sowohl für Ordner als auch für Dateien. Erwägen Sie die Verwendung von os.path.isfile um stattdessen zu prüfen, ob die Datei existiert.

50voto

Tim Keating Punkte 5960

Wie wäre es, ganz im Sinne der Antwort von Andy Jones, mit einer echten ternären Operation?

os.remove(fn) if os.path.exists(fn) else None

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