Python open()函数的标志用于打开或创建文件。

8

Python 3中open(..., mode)的模式是什么?它可以打开一个文件并:

  • 如果不存在则创建
  • 不截断已有内容
  • 二进制模式

我尝试了r+b,但在文件不存在时会失败,w+b会截断内容,a+b似乎将所有写操作都变为追加,而我需要覆盖一些数据。


1
你的回答引入了竞态条件。请参考其他答案的解释。你应该考虑编辑或更改已接受的答案。 - finefoot
2个回答

8

这是C和Python的一个巨大缺陷。无法通过open()实现此功能!

Python的open()类似于C中的fopen() API,但都没有这个功能。

请注意,您发布的try/except方法存在竞争条件
文件可以在两次调用之间被创建,并且突然您将使用第二个调用截断它。

但是:您可以使用os.open()os.fdopen()实现您想要的功能:

fd = os.open(path, os.O_CREAT | os.O_RDWR | os.O_BINARY)
if fd != -1:
    f = os.fdopen(fd, 'r+b')  # Now use 'f' normally; it'll close `fd` itself

1

一种解决方法是捕获异常并使用另一种模式打开。如果有更好的解决方案,我仍然会接受。

try:
    self.file = open(filename, "r+b")
except FileNotFoundError:
    self.file = open(filename, "w+b")

你说的覆盖数据是什么意思? - DeathNet123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接