仅在文件已存在时附加到文件
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.open
和os.fdopen
而不是open
。
open
使用的 "a"
模式尝试使用标志 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")
在我的脚本开始时,文件 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.open
和os.fdopen
而不是open
。
open
使用的 "a"
模式尝试使用标志 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")