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

时间:2010-02-13 22:40:39

标签: python file

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

5 个答案:

答案 0 :(得分:257)

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

os.path.isfile(path)

  

如果路径是现有的,则返回True   常规文件。这符合象征意义   链接,所以islink()和。{   isfile()可以是相同的   路径。

答案 1 :(得分:73)

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

因此:

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

可替换地:

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

后者将创建文件(如果存在),但不是。但是,如果文件存在,它将失败,但您无权写入该文件。这就是为什么我更喜欢第一种解决方案。

答案 2 :(得分:37)

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

您首先检查文件是否存在的任何代码,然后,在您的程序中稍后几行,您创建它,冒着在您不查看并导致问题时创建文件的风险(或者您导致“那个其他文件”问题的所有者。)

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

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(未经测试,仅基于阅读the python documentation,因此可能不是100%正确)。

答案 3 :(得分:13)

如果(当文件不存在时)你想把它创建为空,最简单的方法是

with open(thepath, 'a'): pass

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

另一方面,如果您希望保留文件,如果它存在,但是另外放置特定的非空内容,那么基于if os.path.isfile(thepath): / else语句块的更复杂的方法可能更适合。

答案 4 :(得分:-1)

这对我来说是最好的方式。您可以检索所有现有文件(无论是符号链接还是正常链接):

<强> 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.