Python 打开或创建的 open() 标志
Python open() flags for open or create
open(..., mode) 在 Python 3 中打开一个文件
的模式是什么
- 如果不存在则创建
- 不要截断
- 二进制模式
我测试了 r+b
,但在丢失文件时失败了,w+b
截断了它,a+b
似乎将所有写入都变成了追加,而我需要覆盖一些数据。
解决方法是捕获异常并以另一种模式打开。我仍然会接受更好的解决方案。
try:
self.file = open(filename, "r+b")
except FileNotFoundError:
self.file = open(filename, "w+b")
这是 C 和 Python 中的一个巨大缺陷。无法通过 open()
!!
执行此操作
Python的open()
就像C里的fopen()
API一样,都没有这个能力。
请注意,您发布的 try
/except
方法存在 竞争条件 :
该文件可以在两次调用之间创建,突然您会在第二次调用时截断它。
但是:您可以使用 os.open()
和 os.fdopen()
:[=22= 来实现您想要的效果]
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
open(..., mode) 在 Python 3 中打开一个文件
的模式是什么- 如果不存在则创建
- 不要截断
- 二进制模式
我测试了 r+b
,但在丢失文件时失败了,w+b
截断了它,a+b
似乎将所有写入都变成了追加,而我需要覆盖一些数据。
解决方法是捕获异常并以另一种模式打开。我仍然会接受更好的解决方案。
try:
self.file = open(filename, "r+b")
except FileNotFoundError:
self.file = open(filename, "w+b")
这是 C 和 Python 中的一个巨大缺陷。无法通过 open()
!!
执行此操作
Python的open()
就像C里的fopen()
API一样,都没有这个能力。
请注意,您发布的 try
/except
方法存在 竞争条件 :
该文件可以在两次调用之间创建,突然您会在第二次调用时截断它。
但是:您可以使用 os.open()
和 os.fdopen()
:[=22= 来实现您想要的效果]
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
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