filename
Varsa dosyayı silmek istiyorum . Söylemek doğru mu
if os.path.exists(filename):
os.remove(filename)
Daha iyi bir yol var mı? Tek satırlık bir yol mu?
unlink
ve PHP ad alanına koyun.
filename
Varsa dosyayı silmek istiyorum . Söylemek doğru mu
if os.path.exists(filename):
os.remove(filename)
Daha iyi bir yol var mı? Tek satırlık bir yol mu?
unlink
ve PHP ad alanına koyun.
Yanıtlar:
Daha pitonik bir yol:
try:
os.remove(filename)
except OSError:
pass
Bu daha da fazla satır alsa ve çok çirkin görünse de os.path.exists()
, aşırı istisnaların python kuralına yapılan gereksiz çağrıları önler ve izler.
Bunu sizin için yapacak bir işlev yazmak faydalı olabilir:
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()
yürütüldüğünde var olması , yürütüldüğünde var olduğu anlamına gelmez os.remove()
.
Bir TOCTTOU hata önlemek için, dosyanın varlığını kontrol etmek yerine bir istisna bastırmak tercih ederim . Matt'in cevabı bunun iyi bir örneğidir, ancak Python 3 altında bunu biraz basitleştirebiliriz contextlib.suppress()
:
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove(filename)
Eğer filename
bir olan pathlib.Path
yerine bir dize amacı, onun çağırabilir .unlink()
kullanmak yerine yöntemi os.remove()
. Deneyimlerime göre, Path nesneleri dosya sistemi manipülasyonu için dizelerden daha kullanışlıdır.
Bu yanıttaki her şey Python 3'e özel olduğundan, yükseltmek için başka bir neden daha sağlar.
unlink(2)
Buradaki en eski ilgili arayüz olan tutarlılık istediklerinden şüpheleniyorum .
except
maddeye ihtiyacınız varsa , try
/ kullanmalısınız except
. Bu anlamlı Eğer birinci bloğu tanıtmak için bir çizgi olmalıdır blok kendisi bir çizgi ikinci bloğu tanıtmak çünkü kısaltılmış ve olamaz sonra blok, yani o try
/ except
olabildiğince kısa ve öz olarak zaten.
os.path.exists
True
dosyalar ve klasörler için döner . os.path.isfile
Dosyanın var olup olmadığını kontrol etmek için kullanmayı düşünün .
Andy Jones'un cevabının ruhuna göre, otantik bir üçlü operasyona ne dersiniz:
os.remove(fn) if os.path.exists(fn) else None
Python 3.8'den itibaren, missing_ok=True
ve pathlib.Path.unlink
( burada dokümanlar ) kullanın
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()
Dosyanın (veya dosyaların) var olup olmadığını bilmenin ve kaldırmanın başka bir yolu da modül globunu kullanmaktır.
from glob import glob
import os
for filename in glob("*.csv"):
os.remove(filename)
Glob, * nix joker karakterli deseni seçebilecek tüm dosyaları bulur ve listeyi döngüler.
Matt'in cevabı yaşlı Pythonlar için doğru, Kevin ise yeni olanlar için doğru cevap.
İşlevini kopyalamak istemiyorsanız silentremove
, bu işlev path.py dosyasında remove_p olarak görünür :
from path import Path
Path(filename).remove_p()
if os.path.exists(filename): os.remove(filename)
tek astarlıdır.
Birçoğunuz katılmıyorsunuz - muhtemelen üçlülerin "çirkin" önerilen kullanımını düşünmek gibi nedenlerle - ama bu, standart olmayan "çirkin" dediklerinde çirkin standartlar için kullanılan insanları dinleyip dinlemememiz gerektiği sorusunu akla getiriyor.
Python 3.4 veya sonraki sürümlerinde, pythonic yolu şöyle olacaktır:
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
Böyle bir şey mi? Kısa devre değerlendirmeden yararlanır. Dosya yoksa, tüm koşul doğru olamaz, bu nedenle python ikinci bölümü değerlendirmeyi rahatsız etmez.
os.path.exists("gogogo.php") and os.remove("gogogo.php")
Bir KISS şunları sunar:
def remove_if_exists(filename):
if os.path.exists(filename):
os.remove(filename)
Ve sonra:
remove_if_exists("my.file")
İstisnada kendi mesajınız olan başka bir çözüm.
import os
try:
os.remove(filename)
except:
print("Not able to delete the file %s" % filename)
Ben kullandım rm
ile varolmayan dosyaları silmek için zorlayabilir hangi --preserve-root
bir seçenek olarak rm
.
--preserve-root
do not remove `/' (default)
rm --help | grep "force"
-f, --force ignore nonexistent files and arguments, never prompt
Ayrıca safe-rm ( sudo apt-get install safe-rm
) kullanabiliriz
Safe-rm, / bin / rm'yi bir paketleyici ile değiştirerek önemli dosyaların yanlışlıkla silinmesini önlemeyi amaçlayan bir güvenlik aracıdır ve verilen bağımsız değişkenleri hiçbir zaman kaldırılmaması gereken yapılandırılabilir bir dosya ve dizin listesine karşı kontrol eder.
Önce klasör / dosya yolunun mevcut olup olmadığını kontrol ediyorum. Bu, fileToRemove /
klasörünün ayarlanmasını önleyecektirToRemove 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
Güvenli bir şekilde kullanmak ve önlemek için cevabımı ekledim rm -r /
. @JonBrave
rm -f --preserve-root
yeterince iyi değil ( --preserve-root
muhtemelen zaten varsayılan). -r /
Örnek olarak verdim , -r /home
ya öyleyse ya da her neyse? Muhtemelen istiyorsun rm -f -- $fileToRemove
, ama mesele bu değil.
os.system('rm ...')
kalmak son derece tehlikelidir, üzgünüm.