小编典典

如果文件在Python中不存在,则以原子方式创建文件

python

我正在寻找以下内容的原子版本:

import os

def tryMakeFile(filename):
    try:
        with open(filename) as _:
            return False
    except FileNotFoundError:
        with open(filename, mode='a') as _:
            return True

(请不要在这里对风格问题发表评论-我知道这段代码在很多方面都是不好的,但是足以说明我的问题。)

换句话说,我正在寻找一种方法来检查文件是否存在,并在Python中以一种我知道发生了什么的方式创建它(如果不存在)。但是,这样做的方式是多个进程之间没有竞争条件(在我给定的示例代码中,如果第二个进程在第一个进程暂停于第一个和第二个打开之间的同时运行,则两个进程都可以认为自己创建了文件电话)。

或者,换句话说,我正在寻找与Java的Files.createFile调用等效的Python

编辑:请注意,当我说“
Python”时,我的意思是“便携式Python”。我说的不是说“使用此库此库仅在Windows上可用,或者在Windows上不可用,或者仅在蓝色月亮之后的第二个星期二提供)”。我正在寻找明确属于原子的东西,它们是标准库和/或内置插件的一部分,并且可以在常见平台上使用。


阅读 209

收藏
2020-12-20

共1个答案

小编典典

您可以使用带有标志的os.open,如果文件存在,os.O_CREAT | os.O_EXCL 标志将失败,它们根据 Unix和Windows上提供 的文档 但是我不确定 Windows上 是否存在原子文件创建:

os.open("filename", os.O_CREAT | os.O_EXCL)

从linux打开手册页

O_EXCL如果设置了O_CREAT和O_EXCL,则如果文件存在,则open()将失败。对于其他执行open()的线程来说,检查文件是否存在以及是否不存在,应该是原子的,对于在同一目录中命名为O_EXCL和O_CREAT的同一目录中的相同文件名,将是原子的。如果设置了O_EXCL和O_CREAT,并且路径名是符号链接,则open()将失败,并将errno设置为[EEXIST],而不管符号链接的内容如何。如果设置了O_EXCL且未设置O_CREAT,则结果不确定。

不确定文件是否存在时要做什么,但是只需要FileExistsError在文件已存在时捕获a :

import os

def try_make_file(filename):
    try:
        os.open(filename,  os.O_CREAT | os.O_EXCL)
        return True
    except FileExistsError:
        return False
2020-12-20