大多数pythonic的方式来删除一个可能不存在的文件

我想删除文件的文件filename如果它存在。 这是适当的说

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

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

更pythonic的方式将是:

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

虽然这需要更多的行,看起来非常丑陋,但它避免了对os.path.exists()的不必要的调用,并遵循过度使用exception的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 

我宁愿压制一个exception,而不是检查文件的存在,以避免TOCTTOU错误。 Matt的答案就是一个很好的例子,但是我们可以在Python 3下使用contextlib.suppress()来简化它:

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

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

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

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

本着安迪·琼斯的回答,真正的三元操作怎么样:

 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通配符select模式的文件,并循环列表。

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

是一个单线。

你们许多人可能会不同意 – 可能出于考虑拟议使用三元组“丑陋”的原因 – 但是这引出了一个问题:我们是否应该听那些丑陋的标准,当他们称之为不规范的“丑陋”时。

像这样的东西? 利用短路评估。 如果文件不存在,则整个条件不成立,所以python不会打扰评估第二部分。

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

马特的答案是正确的老pythons和凯文的新答案是正确的。

如果你不想复制silentremove函数,这个function在path.py中显示为remove_p :

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

我只是使用shutil

import shutil shutil.rmtree(filename, ignore_errors=True)

os.remove应该工作正常:

 import os Input = input('File:') File = Input.get() try: os.remove(File) except: none