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

本问题已经有最佳答案,请猛点这里访问。

检查文件是否存在和是否创建文件的首选方法是什么?


检查路径是否为现有文件:

os.path.isfile(path)

Return True if path is an existing
regular file. This follows symbolic
links, so both islink() and
isfile() can be true for the same
path.


与其使用别人建议的os.path.isfile,我建议使用os.path.exists,它检查具有该名称的任何内容,而不仅仅是一个常规文件。

因此:

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

另外:

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

如果文件存在,则后者将创建该文件,但不创建其他文件。但是,如果文件存在,但您没有权限对其进行写入,则会失败。这就是为什么我更喜欢第一个解。


在我看来,这里的所有其他答案(到目前为止)都不能解决他们提出的解决方案中出现的种族条件。

首先检查文件是否存在的任何代码,然后在程序的几行代码之后创建它,都有可能在您没有查看并导致问题(或导致"其他文件"的所有者出现问题)的情况下创建文件。

如果你想避免这类事情,我建议如下(未经测试):

1
2
3
4
5
6
7
8
9
10
11
12
13
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')

如果文件还不存在,则应该打开文件以供编写,并返回文件对象。如果它确实存在,它将打印"Ooops"并返回None(未经测试,仅基于阅读python文档,因此可能不是100%正确)。


如果(当文件不存在时)希望将其创建为空,最简单的方法是

1
with open(thepath, 'a'): pass

(Python 2.6或更高版本;在2.5中,这需要在模块的顶部有一个"来自未来的导入")。

另一方面,如果您希望在文件存在的情况下不使用它,而是将特定的非空内容放在那里,那么基于if os.path.isfile(thepath):/else语句块的更复杂的方法可能更合适。


这对我来说是最好的方法。您可以检索所有现有的文件(无论是符号链接或普通):

os.path.lexists(路径)

1
2
3
Return True if path refers to an existing path. Returns True for broken symbolic links. Equivalent to exists() on platforms lacking os.lstat().

New in version 2.4.