【问题标题】:Pythonic way to check if a file exists? [duplicate]检查文件是否存在的Pythonic方法? [复制]
【发布时间】:2011-01-16 14:14:16
【问题描述】:

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

【问题讨论】:

标签: python file


【解决方案1】:

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

您首先检查文件是否存在的任何代码,然后在程序中的几行之后创建它,都会冒着文件被创建的风险,而您没有查看并导致您出现问题(或者您导致“其他文件”的所有者出现问题)。

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

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

【讨论】:

  • 这确实有效,但fobj = os.fdopen(fd) 应该是fobj = os.fdopen(ds, 'w'),然后是os.close(fd)
  • 其实该行需要fobj = os.fdopen(fd, 'w')。那是'fd'而不是'ds'
  • 该异常捕获所有内容并以相同的方式处理...如果您明确指定应该在此处捕获的内容会更好。
  • 应该使用except OSError as e
【解决方案2】:

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

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.

【讨论】:

    【解决方案3】:

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

    因此:

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

    或者:

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

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

    【讨论】:

    • 对于 Python 3 需要将 file 替换为 open: if not os.path.exists(filename): open(filename, "w+").close()
    • 你的意思是说“如果文件不存在,后者会创建文件。”?
    • 请注意file(filename, 'w+').close()truncate file if it exists
    【解决方案4】:

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

    os.path.isfile(path)

    如果 path 是现有的,则返回 True 常规文件。这遵循象征性的 链接,所以islink()isfile() 可以同样适用 路径。

    【讨论】:

    • 当然,您可能会遇到竞争条件,即您检查时文件不存在,但在您创建它之前就立即存在。极不可能,但有可能。
    • 如果给定名称存在目录,则返回 true,在这种情况下,后续文件的创建将失败。
    • 我认为您正在考虑 os.path.exists,如果路径存在(即是文件或目录),则返回 True。如上图,当路径为普通文件时,os.path.isfile返回True。
    • 这个答案已经过时了。在 Python 3.4+ 上使用pathlib,如下所示:Path("path/to/file").is_file() 如果您想检查它是否是一个文件并且它是否存在,或者Path("path/to/file").exists() 如果您只想知道它是否存在(但可能是一个目录)。
    【解决方案5】:

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

    with open(thepath, 'a'): pass
    

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

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

    【讨论】:

    • open() 与 os.isfile 相比并不是一个理想的解决方案。如果你只是想检查文件是否存在(虽然确实如此,open 是读写文件的最佳方式),Open 会做一些不必要的操作,并且需要文件的读取权限来验证文件的存在。跨度>
    猜你喜欢
    • 2012-03-12
    • 2018-09-27
    • 2020-02-03
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多