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

Jua*_*nti 186 python file

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

Des*_*egr 264

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

os.path.isfile(path)

True如果path是现有常规文件,则返回.这是继符号链接,这样既islink()并且 isfile()可以为相同的路径是正确的.

  • 我想你正在考虑os.path.exists,如果路径存在(即文件或目录),则返回True.如上所示,当路径是常规文件时,os.path.isfile返回True. (13认同)
  • 当然,你可以进入竞争条件,当你检查时文件不存在,但在你创建它之前就会存在.极不可能,但可能. (10认同)
  • 这个答案已经过时了。在 Python 3.4+ 上使用 [`pathlib`](https://docs.python.org/library/pathlib.html),如下所示: [`Path("path/to/file").is_file()`]( https://docs.python.org/library/pathlib.html#pathlib.Path.is_file) 如果您想检查它是否是一个文件并且存在或 [`Path("path/to/file").exists ()`](https://docs.python.org/library/pathlib.html#pathlib.Path.exists) 如果您只想知道它是否存在(但可能是一个目录)。 (7认同)

小智 75

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

从而:

if not os.path.exists(filename):
    file(filename, 'w').close()
Run Code Online (Sandbox Code Playgroud)

或者:

file(filename, 'w+').close()
Run Code Online (Sandbox Code Playgroud)

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

  • 对于Python 3需要将`file`替换为`open`:`if not os.path.exists(filename): open(filename, "w+").close()` (3认同)
  • 您的意思是说“如果文件不存在,后者将创建该文件。”? (2认同)

Epc*_*lon 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')
Run Code Online (Sandbox Code Playgroud)

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

  • 这确实有效,但是`fobj = os.fdopen(fd)`应该是`fobj = os.fdopen(ds,'w')`,然后是`os.close(fd)`. (2认同)

Ale*_*lli 14

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

with open(thepath, 'a'): pass
Run Code Online (Sandbox Code Playgroud)

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

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