检查文件是否存在的Pythonic方法?

251 投票
5 回答
328929 浏览
提问于 2025-04-15 19:15

检查一个文件是否存在的最佳方法是什么?如果文件不存在,怎么创建它?

5 个回答

42

我觉得这里的其他回答(到目前为止)都没有解决他们提出的方案中可能出现的竞争条件问题。

任何代码如果先检查文件是否存在,然后在程序的几行后再创建这个文件,就有可能在你不注意的时候文件已经被创建了,这样会给你带来麻烦(或者给“那个其他文件”的拥有者带来麻烦)。

如果你想避免这种情况,我建议你可以试试下面的代码(未经测试):

import os

def open_if_not_exists(filename):
    try:
        fd = os.open(filename, os.O_CREAT | os.O_EXCL | os.O_WRONLY)
    except OSError, e:
        if e.errno == 17:
            print e
            return None
        else:
            raise
    else:
        return os.fdopen(fd, 'w')

这段代码应该会在文件不存在时打开文件进行写入,并返回一个文件对象。如果文件已经存在,它会打印“哎呀”并返回None(这段代码未经测试,仅仅是根据Python文档的内容,所以可能不是100%正确)。

95

与其他人建议的使用 os.path.isfile 不同,我建议使用 os.path.exists,因为它可以检查任何名称的文件,而不仅仅是普通文件。

所以:

if not os.path.exists(filename):
    file(filename, 'w').close()

另外一种方法是:

file(filename, 'w+').close()

后者会在文件存在时创建文件,但如果文件不存在就不会创建。不过,如果文件存在但你没有写入权限,它会失败。这就是我更喜欢第一种方法的原因。

321

要检查一个路径是否是一个存在的文件,可以使用:

os.path.isfile(path)

如果这个路径是一个存在的普通文件,就会返回True。这个方法会跟随符号链接,所以对于同一个路径,islink()isfile()都有可能返回真。

撰写回答