用于打开或创建的Python open()标志

时间:2016-07-22 16:02:43

标签: file python-3.x mode

Python 3中open(..., mode)打开文件

的模式是什么
  • 如果不存在则创建
  • 不要截断
  • 二进制模式

我测试了r+b,但是在丢失文件时失败,w+b截断它,a+b似乎将所有写入转换为追加,而我需要覆盖一些数据。

2 个答案:

答案 0 :(得分:1)

这是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 :(得分:0)

解决方法是捕获异常并使用其他模式打开。我仍然会接受更好的解决方案。

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