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

检查文件是否存在的Python方法?,python,file,Python,File,检查文件是否存在以及是否创建文件的首选方法是什么?检查路径是否为现有文件: 如果路径是现有路径,则返回True 常规文件。这是象征性的 链接,因此islink()和 isfile() 路径 如果(当文件不存在时)希望将其创建为空,最简单的方法是 with open(thepath, 'a'): pass (在Python2.6或更高版本中;在2.5中,这需要在模块顶部有一个“从未来导入”) 另一方面,如果您希望在文件存在时不处理它,但在其他情况下将特定的非空内容放在那里,那么基于If os.

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

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

如果路径是现有路径,则返回
True
常规文件。这是象征性的 链接,因此
islink()
isfile()
路径

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

with open(thepath, 'a'): pass
(在Python2.6或更高版本中;在2.5中,这需要在模块顶部有一个“从未来导入”)


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

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

因此:

或者:

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

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

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

任何代码,如果您首先检查文件是否存在,然后在程序中的几行之后创建它,都有可能在您不查看文件时创建该文件,并导致您出现问题(或导致“其他文件”的所有者出现问题)

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


如果文件尚不存在,则应打开文件进行写入,并返回文件对象。如果它确实存在,它将打印“Ooops”并返回None(未经测试,且仅基于读取,因此可能不是100%正确)。

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

os.path.lexsists(path)


当然,您可能会进入一种竞争条件,即检查时文件不存在,但在创建文件之前文件就已经存在了。极不可能,但也有可能。如果以给定名称存在目录,则返回true,在这种情况下,后续文件创建将失败。我认为您考虑的是os.path.exists,如果路径存在(即文件或目录),则返回true。如上所示,当路径为常规文件时,os.path.isfile返回True。此答案已过时。在Python3.4+上使用,如下所示:如果您想检查它是否是一个文件并且它是否存在,或者您只想知道它是否存在(但可能是一个目录)。这确实有效,但是
fobj=os.fdopen(fd)
应该是
fobj=os.fdopen(ds,'w')
然后
os.close(fd)
。实际上,该行需要是
fobj=os.fdopen(fd,'w')
。这是'fd'而不是'ds',异常捕获所有内容并进行相同的处理。。。如果您明确指定应该在那里捕获的内容会更好。应该使用
而不是OSError作为e
。与os.isfile相比,open()不是一个理想的解决方案。如果只想检查文件是否存在,“打开”会执行不必要的操作(尽管这是事实,但“打开”是读取和写入文件的最佳方式),并且需要文件的读取权限来验证文件是否存在。实际重复问题:。在Python3.3+中,在复制文件时使用“x”标志以避免竞争条件。对于Python3,需要将
文件
替换为
打开
如果不是os.path.exists(文件名):open(文件名,“w+”).close()
您的意思是说,“如果文件不存在,后者将创建文件吗?”?注意
文件(文件名,“w+”).close()
将自动关闭。
file(filename, 'w+').close()
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')
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.