563

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

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

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

4

12 回答 12

748

一种更 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
于 2012-05-31T20:10:42.817 回答
223

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

import contextlib

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

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

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

于 2014-11-20T16:49:55.593 回答
57

从 Python 3.8 开始,使用missing_ok=Trueand pathlib.Path.unlink( docs 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()
于 2019-12-04T22:27:58.480 回答
53

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

于 2012-05-31T20:09:44.557 回答
45

本着安迪琼斯回答的精神,真正的三元运算怎么样:

os.remove(fn) if os.path.exists(fn) else None
于 2014-01-14T00:02:39.800 回答
12
if os.path.exists(filename): os.remove(filename)

是单线。

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

于 2017-08-24T18:25:08.733 回答
8

另一种了解文件(或文件)是否存在并删除它的方法是使用模块 glob。

from glob import glob
import os

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

Glob 找到所有可以选择带有 *nix 通配符的模式的文件,然后循环列表。

于 2014-10-23T11:51:55.670 回答
8

Matt 的答案是旧 Python 的正确答案,而Kevin 的答案是新 Python 的正确答案。

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

from path import Path
Path(filename).remove_p()
于 2017-10-28T15:09:49.580 回答
3

在 Python 3.4 或更高版本中,pythonic 方式为:

import os
from contextlib import suppress

with suppress(OSError):
    os.remove(filename)
于 2018-04-18T00:25:46.193 回答
2

像这样的东西?利用短路评估。如果文件不存在,则整个条件不能为真,因此 python 不会打扰评估第二部分。

os.path.exists("gogogo.php") and os.remove("gogogo.php")
于 2012-05-31T20:12:15.847 回答
0

亲吻产品:

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

进而:

remove_if_exists("my.file")
于 2018-07-24T08:01:06.813 回答
0

这是另一种解决方案:

if os.path.isfile(os.path.join(path, filename)):
    os.remove(os.path.join(path, filename))
于 2018-12-24T14:05:29.680 回答