仅在文件已存在时附加到文件

Append to file only if it already exists

在我的脚本开始时,文件 script.log 应该存在并且消息被附加到它。但如果该文件不存在(用户已决定删除该文件),则不应再次创建该文件,而是将消息打印到 stdout看到就装满桶。

怎么做?
一定有很多人遇到过类似的问题,但我找不到任何解决方案。


我的目标是类似下面的代码,但是当找不到文件时,追加模式不会触发任何异常:

try:
    with open('script.log', 'a') as f:
        f.write('foo')
except FileNotFoundError:
    print('foo')

我知道下面的代码应该可以工作,但理想情况下我想避免使用它,因为它包含 race condition:

if os.path.exists('script.log'):
    with open('script.log', 'a') as f:
        f.write('foo')
else:
    print('foo')

分开使用os.openos.fdopen而不是open

open 使用的 "a" 模式尝试使用标志 os.O_APPENDos.O_CREAT 打开文件,如果文件不存在则创建文件。我们将使用 os.fdopen 来使用 只是 os.O_APPEND 标志,导致 如果 FileNotFoundError 尚不存在,则提出。

假设成功,我们将使用 os.fdopenfdopen 返回的文件描述符包装在类文件对象中。 (不幸的是,这需要一个看似多余的 "a" 标志。)

import os
import sys

try:
    fd = os.open('script.log', os.O_APPEND)
    with os.fdopen(fd, "a") as f:
        f.write("foo")
except FileNotFoundError:
    print("foo")