1

考虑以下代码:

try:
    f = open("myfile2.dat", "rb")
except IOError:
    f = open("myfile2.dat", "ab+")
print(f.mode)
f.close()

如果在我运行此代码时 myfile2.dat 不存在 Idle 会打开一个带有 rb+ 而不是 ab+ 的新文件,为什么?

4

2 回答 2

4

您正在以追加 + 写入模式打开一个文件。因为没有要附加的文件,所以您会在读 + 写模式下获得一个文件。

本质上是一样的。这里没有问题,您仍然可以读取写入文件。

在后台,文件仍然以附加模式打开,但该.mode属性提供了一个更简单的文件视图;它只会报告您现在可以对文件执行的操作,而不是您打开文件时发生的情况。它仅显示您是否可以读取或写入文件以及文件是否以独占创建(x模式)打开。

请参阅属性的C 代码.mode

更新:是的,这很令人困惑,而且确实是一个错误。修复此差异的路径最近已合并到 Python 中,当 Python 2.7、3.3 和 3.4 的新版本发布时,文件对象的.mode属性将更好地反映用于打开文件的原始模式字符串。

于 2013-03-21T22:28:10.727 回答
0

编辑:忽略这一点,这是在 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。

于 2013-03-21T22:29:14.507 回答