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

Most pythonic way to delete a file which may not exist

我想删除文件filename,如果它存在的话。说得对吗

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

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


一个更像Python的方法是:

1
2
3
4
try:
    os.remove(filename)
except OSError:
    pass

尽管这需要更多的行,看起来非常难看,但它避免了不必要的调用os.path.exists(),并遵循了过度使用异常的Python约定。

为您编写这样的函数可能是值得的:

1
2
3
4
5
6
7
8
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


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

1
2
3
4
import contextlib

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

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

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


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


根据安迪·琼斯的回答,一个真正的三元操作如何:

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


另一种知道文件(或文件)是否存在并将其删除的方法是使用模块glob。

1
2
3
4
5
from glob import glob
import os

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

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


马特的回答是对老年人的正确答案,凯文的回答是对较新人的正确答案。

如果不想复制silentremove的函数,则会在path.py中将此功能公开为remove_p:

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


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

是一个班轮。

你们中的许多人可能不同意——可能是因为考虑使用三元"丑"之类的原因——但这就引出了一个问题,即当人们把一些非标准的东西称为"丑"时,我们是否应该听取那些习惯于丑标准的人的意见。


在python 3.4或更高版本中,pythonic方法是:

1
2
3
4
5
import os
from contextlib import suppress

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


另一个有您自己消息的解决方案例外。

1
2
3
4
5
6
import os

try:
    os.remove(filename)
except:
    print("Not able to delete the file %s" % filename)

这是另一个解决方案:

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

亲吻礼物:

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

然后:

1
remove_if_exists("my.file")


像这样?利用短路评估。如果文件不存在,那么整个条件就不能为真,所以Python将不需要计算第二部分。

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


我使用了rm,它可以强制删除不存在的--preserve-root文件作为rm的选项。

1
2
--preserve-root
              do not remove `/' (default)
1
2
rm --help | grep"force"
  -f, --force           ignore nonexistent files and arguments, never prompt

我们也可以使用安全的RM(sudo apt-get install safe-rm)

Safe-rm is a safety tool intended to prevent the accidental deletion
of important files by replacing /bin/rm with a wrapper, which checks
the given arguments against a configurable blacklist of files and
directories that should never be removed.

首先,我检查文件夹/文件路径是否存在。这将阻止设置变量filetoremove/foldertoremoveto the stringr/`。

1
2
3
4
5
6
import os, subprocess

fileToRemove = '/home/user/fileName';
if os.path.isfile(fileToRemove):
   subprocess.run(['rm', '-f', '--preserve-root', fileToRemove]
   subprocess.run(['safe-rm', '-f', fileToRemove]