Ich möchte die Datei löschen, filename
falls vorhanden. Ist es richtig zu sagen
if os.path.exists(filename):
os.remove(filename)
Gibt es einen besseren Weg? Ein einzeiliger Weg?
unlink
und fügen Sie sie in den Namespace PHP ein.
Ich möchte die Datei löschen, filename
falls vorhanden. Ist es richtig zu sagen
if os.path.exists(filename):
os.remove(filename)
Gibt es einen besseren Weg? Ein einzeiliger Weg?
unlink
und fügen Sie sie in den Namespace PHP ein.
Antworten:
Ein pythonischerer Weg wäre:
try:
os.remove(filename)
except OSError:
pass
Dies dauert zwar noch mehr Zeilen und sieht sehr hässlich aus, vermeidet jedoch den unnötigen Aufruf os.path.exists()
und folgt der Python-Konvention der übermäßigen Verwendung von Ausnahmen.
Es kann sich lohnen, eine Funktion zu schreiben, um dies für Sie zu tun:
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
os.path.exists()
Ausführung vorhanden ist, bedeutet nicht, dass sie bei der os.remove()
Ausführung vorhanden ist.
Ich ziehe es vor, eine Ausnahme zu unterdrücken, anstatt nach der Existenz der Datei zu suchen , um einen TOCTTOU- Fehler zu vermeiden . Matts Antwort ist ein gutes Beispiel dafür, aber wir können sie unter Python 3 leicht vereinfachen, indem wir contextlib.suppress()
:
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove(filename)
Wenn filename
es sich um ein pathlib.Path
Objekt anstelle eines Strings handelt, können wir dessen .unlink()
Methode anstelle von verwenden os.remove()
. Nach meiner Erfahrung sind Pfadobjekte für die Manipulation des Dateisystems nützlicher als Zeichenfolgen.
Da alles in dieser Antwort exklusiv für Python 3 ist, bietet es einen weiteren Grund für ein Upgrade.
unlink(2)
, was bei weitem die älteste relevante Schnittstelle hier ist.
except
Klausel benötigen , sollten Sie try
/ verwenden except
. Es kann nicht sinnvoll gekürzt werden, da Sie eine Zeile zum Einführen des ersten Blocks, den Block selbst, eine Zeile zum Einführen des zweiten Blocks und dann diesen Block haben müssen, damit try
/ except
bereits so knapp wie möglich ist.
os.path.exists
Gibt sowohl True
für Ordner als auch für Dateien zurück. Verwenden Sie os.path.isfile
, um zu überprüfen, ob die Datei stattdessen vorhanden ist.
Wie wäre es mit einer authentischen ternären Operation im Geiste von Andy Jones 'Antwort:
os.remove(fn) if os.path.exists(fn) else None
Eine andere Möglichkeit, festzustellen, ob die Datei (oder Dateien) vorhanden ist, und sie zu entfernen, ist die Verwendung des Modulglob.
from glob import glob
import os
for filename in glob("*.csv"):
os.remove(filename)
Glob findet alle Dateien, die das Muster mit einem * nix-Platzhalter auswählen könnten, und durchläuft die Liste.
Verwenden Sie ab Python 3.8 missing_ok=True
und 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()
Matts Antwort ist die richtige für ältere Pythons und Kevins die richtige Antwort für neuere.
Wenn Sie die Funktion nicht kopieren möchten silentremove
, wird diese Funktionalität in path.py als remove_p angezeigt :
from path import Path
Path(filename).remove_p()
if os.path.exists(filename): os.remove(filename)
ist ein Einzeiler.
Viele von Ihnen mögen anderer Meinung sein - möglicherweise aus Gründen wie der Betrachtung der vorgeschlagenen Verwendung von Ternären als "hässlich" -, aber dies wirft die Frage auf, ob wir Menschen zuhören sollten, die an hässliche Standards gewöhnt sind, wenn sie etwas Nicht-Standard "hässlich" nennen.
In Python 3.4 oder einer höheren Version wäre der pythonische Weg:
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
Etwas wie das? Nutzt die Kurzschlussauswertung. Wenn die Datei nicht vorhanden ist, kann die gesamte Bedingung nicht wahr sein, sodass Python den zweiten Teil nicht auswertet.
os.path.exists("gogogo.php") and os.remove("gogogo.php")
Ein KISS-Angebot:
def remove_if_exists(filename):
if os.path.exists(filename):
os.remove(filename)
Und dann:
remove_if_exists("my.file")
Eine andere Lösung mit Ihrer eigenen Nachricht in Ausnahme.
import os
try:
os.remove(filename)
except:
print("Not able to delete the file %s" % filename)
Ich habe verwendet rm
, um zu erzwingen, nicht vorhandene Dateien mit --preserve-root
als Option zu löschen rm
.
--preserve-root
do not remove `/' (default)
rm --help | grep "force"
-f, --force ignore nonexistent files and arguments, never prompt
Wir können auch safe-rm ( sudo apt-get install safe-rm
) verwenden
Safe-rm ist ein Sicherheitstool, das das versehentliche Löschen wichtiger Dateien verhindern soll, indem / bin / rm durch einen Wrapper ersetzt wird, der die angegebenen Argumente mit einer konfigurierbaren schwarzen Liste von Dateien und Verzeichnissen vergleicht, die niemals entfernt werden sollten.
Zuerst überprüfe ich, ob Ordner- / Dateipfad vorhanden ist oder nicht. Dadurch wird verhindert, dass die Variable fileToRemove /
folderToRemove to the string
-r / `festgelegt wird.
import os, subprocess
fileToRemove = '/home/user/fileName';
if os.path.isfile(fileToRemove):
subprocess.run(['rm', '-f', '--preserve-root', fileToRemove]
subprocess.run(['safe-rm', '-f', fileToRemove]
rm
sicher zu verwenden und zu verhindern rm -r /
. @ JonBrave
rm -f --preserve-root
ist nicht gut genug ( --preserve-root
ist wahrscheinlich sowieso die Standardeinstellung). Ich gab -r /
als Beispiel , was ist, wenn es -r /home
oder was auch immer? Sie wollen wahrscheinlich rm -f -- $fileToRemove
, aber das ist nicht der Punkt.
os.system('rm ...')
ist äußerst gefährlich, Unachtsame auszusetzen.