删除一个可能不存在的文件的最python方式

我想删除文件filename,如果它存在。这样说合适吗

if os.path.exists(filename):
os.remove(filename)

有没有更好的办法?一条线路?

369047 次浏览

对于文件夹和文件,os.path.exists返回True。考虑使用os.path.isfile来检查文件是否存在。

更python化的方式是:

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

像这样的东西?利用短路评估。如果文件不存在,整个条件就不能为真,所以python不会麻烦求第二部分。

os.path.exists("gogogo.php") and os.remove("gogogo.php")

按照Andy Jones回答的精神,一个真正的三元运算怎么样:

os.remove(fn) if os.path.exists(fn) else None

另一种了解文件(或多个文件)是否存在并删除它的方法是使用模块glob。

from glob import glob
import os


for filename in glob("*.csv"):
os.remove(filename)

Glob找到所有可以使用*nix通配符选择模式的文件,并循环该列表。

我更倾向于抑制异常,而不是检查文件的存在,以避免TOCTTOU错误。Matt的回答是一个很好的例子,但我们可以在Python 3下使用contextlib.suppress()稍微简化它:

import contextlib


with contextlib.suppress(FileNotFoundError):
os.remove(filename)

如果filename是一个pathlib.Path对象而不是一个字符串,我们可以调用它的.unlink()方法而不是使用os.remove()。根据我的经验,对于文件系统操作,Path对象比字符串更有用。

因为这个答案中的所有内容都是Python 3独有的,所以它提供了另一个升级的理由。

if os.path.exists(filename): os.remove(filename)

是一行程序。

你们中的许多人可能不同意——可能是考虑到建议使用三元词“丑陋”——但这引出了一个问题:当人们习惯了丑陋的标准时,当他们把不标准的东西称为“丑陋”时,我们是否应该听从他们的意见。

马特的回答是旧python的正确答案,凯文的是新python的正确答案。

如果你不希望复制silentremove的函数,这个函数在path.py中被暴露为remove_p:

from path import Path
Path(filename).remove_p()

在Python 3.4或更高版本中,Python的方式是:

import os
from contextlib import suppress


with suppress(OSError):
os.remove(filename)

献吻礼:

def remove_if_exists(filename):
if os.path.exists(filename):
os.remove(filename)

然后:

remove_if_exists("my.file")

这是另一个解决方案:

if os.path.isfile(os.path.join(path, filename)):
os.remove(os.path.join(path, filename))

从Python 3.8开始,使用missing_ok=Truepathlib.Path.unlink (这里的文档)

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()

从Python 3.3开始你可以使用FileNotFoundError,它比公认的版本更正确,因为它没有忽略其他可能的错误。

try:
os.remove(filename)
except FileNotFoundError:
pass