【发布时间】:2011-01-16 14:14:16
【问题描述】:
检查文件是否存在以及不创建文件的首选方法是什么?
【问题讨论】:
-
实际重复问题:Safely create a file if and only if it does not exist with python。在 Python 3.3+ 中,
open()ing 文件时使用“x”标志以避免竞争条件。
检查文件是否存在以及不创建文件的首选方法是什么?
【问题讨论】:
open()ing 文件时使用“x”标志以避免竞争条件。
在我看来,这里的所有其他答案(到目前为止)都未能解决他们提出的解决方案出现的竞争条件。
您首先检查文件是否存在的任何代码,然后在程序中的几行之后创建它,都会冒着文件被创建的风险,而您没有查看并导致您出现问题(或者您导致“其他文件”的所有者出现问题)。
如果你想避免这种事情,我建议如下(未经测试):
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。
这对我来说是最好的方式。您可以检索所有现有文件(无论是符号链接还是普通文件):
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.
【讨论】:
我建议使用os.path.exists,而不是其他人建议的os.path.isfile,它会检查具有该名称的任何内容,而不仅仅是它是否是常规文件。
因此:
if not os.path.exists(filename):
file(filename, 'w').close()
或者:
file(filename, 'w+').close()
如果文件存在,后者将创建文件,否则不创建。但是,如果文件存在,但您没有写入权限,它将失败。这就是为什么我更喜欢第一种解决方案。
【讨论】:
file 替换为 open: if not os.path.exists(filename): open(filename, "w+").close()
file(filename, 'w+').close() 将truncate file if it exists。
检查路径是否为现有文件:
如果 path 是现有的,则返回
True常规文件。这遵循象征性的 链接,所以islink()和isfile()可以同样适用 路径。
【讨论】:
pathlib,如下所示:Path("path/to/file").is_file() 如果您想检查它是否是一个文件并且它是否存在,或者Path("path/to/file").exists() 如果您只想知道它是否存在(但可能是一个目录)。
如果(当文件不存在时)您想将其创建为空,最简单的方法是
with open(thepath, 'a'): pass
(在 Python 2.6 或更高版本中;在 2.5 中,这需要模块顶部的“从未来导入”)。
另一方面,如果您想在文件存在的情况下将其保留,但将特定的非空内容放在那里,那么基于 if os.path.isfile(thepath):/else 语句块的更复杂的方法可能更合适.
【讨论】: