删除可能不存在的文件的大多数pythonic方法

新手上路,请多包涵

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

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

有没有更好的办法?单线方式?

原文由 Scott C Wilson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 264
2 个回答

一种更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

原文由 Matt 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

 import contextlib

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

If filename is a pathlib.Path object instead of a string, we can call its .unlink() method instead of using os.remove() .根据我的经验,Path 对象在文件系统操作方面比字符串更有用。

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

原文由 Kevin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题