我要删除该文件(filename
如果存在)。说的合适吗
if os.path.exists(filename):
os.remove(filename)
有没有更好的办法?单行方式?
unlink
,并将其放在PHP命名空间中。
我要删除该文件(filename
如果存在)。说的合适吗
if os.path.exists(filename):
os.remove(filename)
有没有更好的办法?单行方式?
unlink
,并将其放在PHP命名空间中。
Answers:
一种更pythonic的方式是:
try:
os.remove(filename)
except OSError:
pass
尽管这需要花费更多的行,并且看起来很丑陋,但可以避免不必要的调用 os.path.exists()
并遵循过度使用异常的python约定。
可能值得编写一个函数为您执行此操作:
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()
执行时存在的事实并不意味着文件在执行时存在os.remove()
。
我更喜欢抑制异常,而不是检查文件的存在,以避免TOCTTOU错误。Matt的答案就是一个很好的例子,但是我们可以在Python 3下使用contextlib.suppress()
以下方法稍微简化一下:
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove(filename)
如果filename
是一个pathlib.Path
对象而不是字符串,我们可以调用其.unlink()
方法而不是使用os.remove()
。以我的经验,Path对象比字符串更有用。
由于此答案中的所有内容都是Python 3专有的,因此它提供了另一个升级理由。
unlink(2)
,这是迄今为止最古老的相关接口。
except
子句,则应使用try
/ except
。它不能被有意义地缩短,因为您必须有一行来引入第一个块,该块本身,有一行来引入第二个块,然后是该块,所以try
/ except
已经尽可能简洁。
os.path.exists
返回True
文件夹和文件。考虑使用os.path.isfile
来检查文件是否存在。
本着安迪·琼斯(Andy Jones)的回答精神,如何进行真正的三元运算:
os.remove(fn) if os.path.exists(fn) else None
if os.path.exists(filename): os.remove(filename)
是单线的。
你们中的许多人可能会不同意(可能是出于考虑将三元体系建议使用为“丑陋”的理由)的想法,但这引出了一个问题,即当人们习惯将丑陋标准称为“非丑陋”时,我们是否应该听取他们的意见。
像这样吗 利用短路评估。如果文件不存在,则整个条件不能为真,因此python不会麻烦评估第二部分。
os.path.exists("gogogo.php") and os.remove("gogogo.php")
亲吻提供:
def remove_if_exists(filename):
if os.path.exists(filename):
os.remove(filename)
然后:
remove_if_exists("my.file")
带有您自己的消息的另一种解决方案。
import os
try:
os.remove(filename)
except:
print("Not able to delete the file %s" % filename)
我曾经用过rm
,它可以强制删除不存在的文件,并可以将其--preserve-root
作为选项rm
。
--preserve-root
do not remove `/' (default)
rm --help | grep "force"
-f, --force ignore nonexistent files and arguments, never prompt
我们也可以使用safe-rm(sudo apt-get install safe-rm
)
Safe-rm是一种安全工具,旨在通过使用包装程序替换/ bin / rm来防止重要文件的意外删除,该包装程序将对给定的参数与永不删除的可配置文件和目录黑名单进行检查。
首先,我检查文件夹/文件路径是否存在。这将防止设置变量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
安全使用和预防rm -r /
。@JonBrave
rm -f --preserve-root
还不够好(--preserve-root
无论如何可能都是默认值)。我举了-r /
一个例子,那是-r /home
什么?您可能想要rm -f -- $fileToRemove
,但这不是重点。
os.system('rm ...')
抱歉,将粗心的人暴露在极端危险中。