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


当前回答

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

os.path.lexists(路径)

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.

其他回答

检查路径是否存在文件。

os.path.isfile(路径)

如果path已经存在,则返回True 常规文件。这是象征性的 链接,所以islink()和 Isfile()可以为true 路径。

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

with open(thepath, 'a'): pass

(在Python 2.6或更高版本中;在2.5中,这需要在模块的顶部“从未来导入”)。

另一方面,如果你想在文件存在的情况下保留它,而在其他情况下放置特定的非空内容,那么基于If os.path.isfile(thepath):/else语句块的更复杂的方法可能更合适。

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

os.path.lexists(路径)

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.

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

任何您首先检查文件是否存在,然后在程序的几行之后创建它的代码,都有在您不查看时创建文件并给您带来问题的风险(或者您给“其他文件”的所有者带来问题)。

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

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%正确)。

而不是os.path。isfile,由其他人建议,我建议使用os.path。Exists,它检查使用该名称的任何内容,而不仅仅是它是否是常规文件。

因此:

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

另外:

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

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