考虑以下代码:
try:
f = open("myfile2.dat", "rb")
except IOError:
f = open("myfile2.dat", "ab+")
print(f.mode)
f.close()
如果在我运行此代码时 myfile2.dat 不存在 Idle 会打开一个带有 rb+ 而不是 ab+ 的新文件,为什么?
考虑以下代码:
try:
f = open("myfile2.dat", "rb")
except IOError:
f = open("myfile2.dat", "ab+")
print(f.mode)
f.close()
如果在我运行此代码时 myfile2.dat 不存在 Idle 会打开一个带有 rb+ 而不是 ab+ 的新文件,为什么?
您正在以追加 + 写入模式打开一个新文件。因为没有要附加到的文件,所以您会在读 + 写模式下获得一个文件。
这本质上是一样的。这里没有问题,您仍然可以读取和写入文件。
在后台,文件仍然以附加模式打开,但该.mode
属性提供了一个更简单的文件视图;它只会报告您现在可以对文件执行的操作,而不是您打开文件时发生的情况。它仅显示您是否可以读取或写入文件以及文件是否以独占创建(x
模式)打开。
更新:是的,这很令人困惑,而且确实是一个错误。修复此差异的路径最近已合并到 Python 中,当 Python 2.7、3.3 和 3.4 的新版本发布时,文件对象的.mode
属性将更好地反映用于打开文件的原始模式字符串。
编辑:忽略这一点,这是在 Python 2.x 上完成的,我在原始问题中没有看到 #python-3.x 标记。
它为我打开了 ab+:
>>> try:
... f = open("myfile2.dat", "rb")
... except IOError:
... f = open("myfile2.dat", "ab+")
...
>>> print(f.mode)
ab+
这是在 Mac 上运行 Jython。