Saya ingin menghapus file filenamejika ada. Apakah pantas dikatakan
if os.path.exists(filename):
os.remove(filename)
Apakah ada cara yang lebih baik? Cara satu baris?
unlinkdan letakkan di namespace PHP.
Saya ingin menghapus file filenamejika ada. Apakah pantas dikatakan
if os.path.exists(filename):
os.remove(filename)
Apakah ada cara yang lebih baik? Cara satu baris?
unlinkdan letakkan di namespace PHP.
Jawaban:
Cara yang lebih pythonic adalah:
try:
os.remove(filename)
except OSError:
pass
Meskipun ini membutuhkan lebih banyak baris dan terlihat sangat jelek, ia menghindari panggilan yang tidak perlu os.path.exists()dan mengikuti konvensi python tentang terlalu banyak menggunakan pengecualian.
Mungkin bermanfaat untuk menulis fungsi untuk melakukan ini untuk Anda:
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()dieksekusi tidak berarti bahwa itu ada ketika os.remove()dieksekusi.
Saya lebih suka menekan pengecualian daripada memeriksa keberadaan file, untuk menghindari bug TOCTTOU . Jawaban Matt adalah contoh yang bagus untuk ini, tetapi kita dapat menyederhanakannya sedikit di bawah Python 3, menggunakan contextlib.suppress():
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove(filename)
Jika filenameadalah pathlib.Pathobjek bukan string, kita dapat memanggil nya .unlink()metode daripada menggunakan os.remove(). Dalam pengalaman saya, objek Path lebih berguna daripada string untuk manipulasi sistem file.
Karena segala sesuatu dalam jawaban ini eksklusif untuk Python 3, itu memberikan alasan lain untuk memutakhirkan.
unlink(2), yang sejauh ini merupakan antarmuka relevan tertua di sini.
exceptklausa, maka Anda harus menggunakan try/ except. Hal ini tidak dapat bermakna dipersingkat, karena Anda harus memiliki garis untuk memperkenalkan blok pertama, blok itu sendiri, garis untuk memperkenalkan blok kedua, dan kemudian blok, sehingga try/ exceptsudah sebagai singkat mungkin.
os.path.existskembali Trueuntuk folder dan juga file. Coba gunakan os.path.isfileuntuk memeriksa apakah file itu ada.
Dalam semangat jawaban Andy Jones, bagaimana dengan operasi ternary yang otentik:
os.remove(fn) if os.path.exists(fn) else None
Pada Python 3.8, gunakan missing_ok=Truedan pathlib.Path.unlink( dokumentasi di sini )
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()
Jawaban Matt adalah jawaban yang tepat untuk Python yang lebih lama dan Kevin jawaban yang tepat untuk yang lebih baru.
Jika anda tidak ingin menyalin fungsi untuk silentremove, fungsi ini terkena di path.py sebagai remove_p :
from path import Path
Path(filename).remove_p()
if os.path.exists(filename): os.remove(filename)
adalah satu-liner.
Banyak dari Anda mungkin tidak setuju - mungkin karena alasan seperti mempertimbangkan usulan penggunaan terner "jelek" - tetapi ini menimbulkan pertanyaan apakah kita harus mendengarkan orang-orang yang terbiasa dengan standar jelek ketika mereka menyebut sesuatu yang tidak standar "jelek".
Dalam versi Python 3.4 atau yang lebih baru, cara pythonic adalah:
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
Sesuatu seperti ini? Mengambil keuntungan dari evaluasi hubung singkat. Jika file tidak ada, seluruh persyaratan tidak mungkin benar, sehingga python tidak akan repot mengevaluasi bagian kedua.
os.path.exists("gogogo.php") and os.remove("gogogo.php")
Penawaran KISS:
def remove_if_exists(filename):
if os.path.exists(filename):
os.remove(filename)
Lalu:
remove_if_exists("my.file")
Solusi lain dengan pesan Anda sendiri dalam pengecualian.
import os
try:
os.remove(filename)
except:
print("Not able to delete the file %s" % filename)
Saya telah menggunakan rmyang dapat memaksa untuk menghapus file yang tidak ada dengan --preserve-rootsebagai opsi untuk rm.
--preserve-root
do not remove `/' (default)
rm --help | grep "force"
-f, --force ignore nonexistent files and arguments, never prompt
Kita juga bisa menggunakan safe-rm ( sudo apt-get install safe-rm)
Safe-rm adalah alat keamanan yang dimaksudkan untuk mencegah penghapusan file penting secara tidak disengaja dengan mengganti / bin / rm dengan pembungkus, yang memeriksa argumen yang diberikan terhadap daftar hitam file dan direktori yang dapat dikonfigurasi yang tidak boleh dihapus.
Pertama saya memeriksa apakah folder / path file ada atau tidak. Ini akan mencegah pengaturan variabel 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]
rmdengan aman dan mencegah rm -r /. @JonBrave
rm -f --preserve-roottidak cukup baik ( --preserve-rootmungkin standarnya sih). Saya memberi -r / contoh , bagaimana jika itu -r /homeatau apa pun? Anda mungkin ingin rm -f -- $fileToRemove, tetapi bukan itu intinya.
os.system('rm ...')sangat berbahaya, maaf.