Chcę usunąć plik, filename
jeśli istnieje. Czy to właściwe powiedzieć?
if os.path.exists(filename):
os.remove(filename)
Czy jest lepszy sposób? Jednowierszowy sposób?
unlink
i umieść ją w przestrzeni nazw PHP.
Chcę usunąć plik, filename
jeśli istnieje. Czy to właściwe powiedzieć?
if os.path.exists(filename):
os.remove(filename)
Czy jest lepszy sposób? Jednowierszowy sposób?
unlink
i umieść ją w przestrzeni nazw PHP.
Odpowiedzi:
Bardziej pythonowym sposobem byłoby:
try:
os.remove(filename)
except OSError:
pass
Chociaż wymaga to jeszcze większej liczby wierszy i wygląda bardzo brzydko, unika niepotrzebnego wywołania os.path.exists()
i przestrzega konwencji pythonowej nadużywania wyjątków.
Warto napisać funkcję, która zrobi to za Ciebie:
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()
jest wykonywany, nie oznacza, że istnieje podczas os.remove()
wykonywania.
Wolę pomijać wyjątek niż sprawdzać istnienie pliku, aby uniknąć błędu TOCTTOU . Odpowiedź Matta jest tego dobrym przykładem, ale możemy to nieco uprościć w Pythonie 3, używając contextlib.suppress()
:
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove(filename)
Jeśli filename
jest pathlib.Path
obiektem zamiast ciągu, możemy wywołać jego .unlink()
metodę zamiast używać os.remove()
. Z mojego doświadczenia wynika, że obiekty Path są bardziej przydatne niż ciągi do manipulacji systemem plików.
Ponieważ wszystko w tej odpowiedzi dotyczy wyłącznie Pythona 3, jest to kolejny powód do aktualizacji.
unlink(2)
, która jest zdecydowanie najstarszym odpowiednim interfejsem tutaj.
except
klauzuli, powinieneś użyć try
/ except
. Nie można go znacząco skrócić, ponieważ musisz mieć linię do wprowadzenia pierwszego bloku, samego bloku, linię do wprowadzenia drugiego bloku, a następnie ten blok, więc try
/ except
jest już tak zwięzły, jak to możliwe.
os.path.exists
zwraca True
zarówno foldery, jak i pliki. Rozważ użycie, os.path.isfile
aby sprawdzić, czy plik istnieje zamiast tego.
W duchu odpowiedzi Andy'ego Jonesa, co powiesz na autentyczną operację potrójną:
os.remove(fn) if os.path.exists(fn) else None
Innym sposobem na sprawdzenie, czy plik (lub pliki) istnieje, i usunięcie go, jest użycie modułu glob.
from glob import glob
import os
for filename in glob("*.csv"):
os.remove(filename)
Glob znajduje wszystkie pliki, które mogłyby wybrać wzorzec z symbolem wieloznacznym * nix, i zapętla listę.
Począwszy od Python 3.8, użyj missing_ok=True
i pathlib.Path.unlink
( dokumenty tutaj )
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()
Odpowiedź Matta jest odpowiednia dla starszych Pythonów, a Kevin odpowiednia dla nowych.
Jeśli nie chcesz kopiować funkcji silentremove
, ta funkcja jest dostępna w path.py jako remove_p :
from path import Path
Path(filename).remove_p()
if os.path.exists(filename): os.remove(filename)
jest jednowarstwowy.
Wielu z was może się nie zgodzić - być może z powodów takich jak rozważenie proponowanego użycia trójek jako „brzydkich” - ale rodzi się pytanie, czy powinniśmy słuchać ludzi przyzwyczajonych do brzydkich standardów, gdy nazywają coś niestandardowego „brzydkim”.
W Pythonie 3.4 lub nowszym pythonowym sposobem byłoby:
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
Coś takiego? Wykorzystuje ocenę zwarcia. Jeśli plik nie istnieje, cały warunek nie może być prawdziwy, więc python nie będzie zawracał sobie głowy oceną drugiej części.
os.path.exists("gogogo.php") and os.remove("gogogo.php")
Oferta KISS:
def remove_if_exists(filename):
if os.path.exists(filename):
os.remove(filename)
I wtedy:
remove_if_exists("my.file")
Inne rozwiązanie z twoim własnym komunikatem w wyjątku.
import os
try:
os.remove(filename)
except:
print("Not able to delete the file %s" % filename)
Użyłem rm
które mogą wymusić usunięcie nieistniejących plików z --preserve-root
jako opcja rm
.
--preserve-root
do not remove `/' (default)
rm --help | grep "force"
-f, --force ignore nonexistent files and arguments, never prompt
Możemy również użyć safe-rm ( sudo apt-get install safe-rm
)
Safe-rm to narzędzie bezpieczeństwa, którego zadaniem jest zapobieganie przypadkowemu usunięciu ważnych plików poprzez zamianę / bin / rm na opakowanie, które sprawdza podane argumenty względem konfigurowalnej czarnej listy plików i katalogów, których nigdy nie należy usuwać.
Najpierw sprawdzam, czy ścieżka do folderu / pliku istnieje, czy nie. Zapobiegnie to ustawianiu zmiennej fileToRemove /
folderToRemove to the string
-r / `.
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
bezpiecznie i zapobiegać rm -r /
. @JonBrave
rm -f --preserve-root
nie jest wystarczająco dobry (i --preserve-root
tak prawdopodobnie jest domyślny). Podałem -r /
jako przykład , co jeśli to -r /home
czy coś? Prawdopodobnie chcesz rm -f -- $fileToRemove
, ale nie o to chodzi.
os.system('rm ...')
jest niezwykle niebezpieczne, przepraszam.