python - 仅当文件已存在时才追加到文件

标签 python file-io

在我的脚本开始时,文件 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 .

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

假设成功,我们将使用os.fdopen包装 fdopen 返回的文件描述符在类似文件的对象中。 (不幸的是,这需要一个看似多余的 "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")

关于python - 仅当文件已存在时才追加到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59735588/

相关文章:

python - 在创建实例时创建配置文件模型

python - else 在继续、中断或返回之后

java - JTable数据垂直滚动时不稳定

c# - Server 2008 任务计划程序映射驱动器访问 C#

java - writeArray 二进制文件未在 readArray 中显示完整数组

python - awscli 无法在 OS X 上运行,不断收到 ImportError : No module named awscli_plugin_endpoint

python - python 中的 def 函数在 tpl 文件中?

Python子进程(错误?)合并ssh的stderr和stdout

C:编辑二进制文件

c - 无法使用 fopen() 打开文件