【发布时间】:2016-01-31 14:47:49
【问题描述】:
我正在编写单元测试,看看如果我的代码在以只读和二进制模式(rb 模式)打开的二进制文件的末尾进行查找和读取时会发生什么。
我很确定在这种情况下会引发异常,但事实并非如此(在 Python 3.x 上测试):
>>> fname = r"c:\tmp\test.bin"
>>> os.path.getsize(fname)
60
>>> f = open(fname, "rb")
>>> f.seek(100)
100
>>> f.tell()
100
>>> f.read()
b''
>>>
问题:
- 为什么允许这种行为(从 C 继承?)?我了解写入模式下文件的行为,但不了解只读模式。
- 读取文件末尾是否被视为未定义行为?它是否总是返回一个空的
bytes?是否定义了实现?
编辑:将模式从 r+b 更改为 rb,行为仍然相同。
【问题讨论】:
-
@Alik:那些文档不适用于 Py3;他们将其描述为包装
fread,在 Py3 中,they moved to using the raw OS I/O interfaces, not the C standard buffered I/O interfaces,所有缓冲都直接在 Python 中实现。 -
@ShadowRanger 哎呀,我没注意 OP 使用的 python 版本。
-
+添加到任何r、w、a文件模式指定文件将以读写模式打开。二进制只读模式是rb,而不是r+b。此页面上有一个带有文件模式的漂亮表格:tutorialspoint.com/python/python_files_io.htm -
@Nikita:好的,谢谢你的评论,我不知道。我用
rb模式而不是r+b编辑了问题。行为仍然相同。
标签: python file python-3.x