【问题标题】:Python open() flags for open or create用于打开或创建的 Python open() 标志
【发布时间】:2016-11-26 14:54:09
【问题描述】:

open(..., mode) 在 Python 3 中打开文件的模式是什么

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

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

【问题讨论】:

  • 您的回答引入了竞争条件。请参阅其他答案以获取解释。您应该考虑编辑或更改接受的答案

标签: file python-3.x mode


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 那么覆盖一些数据是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2014-01-24
    • 2016-10-27
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多