大多数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