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

哪个是检查文件是否存在的首选方法?

检查path是否是现有文件:

os.path.isfile(path)

如果path是现有的常规文件,则返回True 。 这遵循符号链接,所以islink()isfile()对于相同的path可以是true。

而不是别人build议的os.path.exists ,我build议使用os.path.exists ,它检查任何有这个名字的东西,而不仅仅是一个普通的文件。

从而:

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

或者:

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

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

在我看来,这里的所有其他答案(迄今为止)都未能解决与他们提出的解决scheme相关的竞争条件。

任何代码,你首先检查文件的存在,然后,在你的程序的几行后,你创build它,运行的风险,创build文件,而你不在寻找,并导致你的问题(或你造成的所有者“其他文件”的问题)。

如果你想避免这样的事情,我会build议像下面这样(未经testing):

 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(未经testing,仅基于阅读python文档 ,因此可能不是100%正确的)。

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

 with open(thepath, 'a'): pass 

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

另一方面,如果你想把文件保留在单独的文件中,但是在那里存放特定的非空内容,那么基于if os.path.isfile(thepath): / else语句块的更复杂的方法可能更加合适。

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

os.path.lexists(path)

 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.