我想删除文件filename
(如果存在)。是否适当说
if os.path.exists(filename):
os.remove(filename)
有更好的方法吗?单行方式?
答案 0 :(得分:554)
更加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
答案 1 :(得分:133)
我更喜欢抑制异常,而不是检查文件的存在,以避免TOCTTOU错误。 Matt的答案就是一个很好的例子,但我们可以使用contextlib.suppress()
在Python 3下稍微简化一下:
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove(filename)
如果filename
是pathlib.Path
对象而不是字符串,我们可以调用其.unlink()
方法,而不是使用os.remove()
。根据我的经验,Path对象比文件系统操作的字符串更有用。
由于本答案中的所有内容都是Python 3独有的,因此它提供了升级的另一个原因。
答案 2 :(得分:47)
os.path.exists
会为文件夹和文件返回True
。请考虑使用os.path.isfile
来检查文件是否存在。
答案 3 :(得分:36)
根据安迪·琼斯的回答,如何进行真正的三元操作:
os.remove(fn) if os.path.exists(fn) else None
答案 4 :(得分:8)
另一种知道文件(或文件)是否存在以及将其删除的方法是使用模块glob。
from glob import glob
import os
for filename in glob("*.csv"):
os.remove(filename)
Glob找到所有可以使用* nix通配符选择模式的文件,并循环列表。
答案 5 :(得分:4)
(2592,3888,3)
是一个单行。
你们中的许多人可能不同意 - 可能是出于考虑建议使用“丑陋”三元的原因 - 但这引出了一个问题:我们是否应该倾听那些习惯于丑陋标准的人,当他们称之为非标准的“丑陋”时。
答案 6 :(得分:4)
Matt's answer是适合较年长的蟒蛇的Kevin's,path.py是适合较新蟒蛇的正确答案。
如果您不想复制silentremove
的功能,则此功能会在remove_p https://realm.io/docs/中公开:
from path import Path
Path(filename).remove_p()
答案 7 :(得分:2)
在Python 3.4或更高版本中,pythonic方式是:
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
答案 8 :(得分:0)
这样的东西?利用短路评估。如果文件不存在,则整个条件不能为真,因此python不会打扰第二部分的评估。
os.path.exists("gogogo.php") and os.remove("gogogo.php")
答案 9 :(得分:0)
KISS产品:
def remove_if_exists(filename):
if os.path.exists(filename):
os.remove(filename)
然后:
remove_if_exists("my.file")
答案 10 :(得分:0)
这是另一种解决方案:
if os.path.isfile(os.path.join(path, filename)):
os.remove(os.path.join(path, filename))
答案 11 :(得分:0)
另一种解决方案,您自己的消息例外。
import os
try:
os.remove(filename)
except:
print("Not able to delete the file %s" % filename)
答案 12 :(得分:0)
从Python 3.8开始,使用missing_ok=True
和pathlib.Path.unlink
(docs here)
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()
答案 13 :(得分:-1)
我使用$ gedit ../Tasks/task_list.txt
可以强制删除不存在的文件rm
作为--preserve-root
的选项。
rm
--preserve-root
do not remove `/' (default)
我们也可以使用safe-rm(rm --help | grep "force"
-f, --force ignore nonexistent files and arguments, never prompt
)
Safe-rm是一种旨在防止意外删除的安全工具 通过用包装器替换/ bin / rm重要文件,检查 针对可配置的文件和黑名单的给定参数 永远不应删除的目录。
首先,我检查文件夹/文件路径是否存在。这将阻止设置变量fileToRemove sudo apt-get install safe-rm
folderToRemove /
- r /`。
to the string