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

时间:2012-05-31 20:06:15

标签: python

我想删除文件filename(如果存在)。是否适当说

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

有更好的方法吗?单行方式?

14 个答案:

答案 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)

如果filenamepathlib.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'spath.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=Truepathlib.Path.unlinkdocs 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-rmrm --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