为什么Python不';如果查找和读取超过文件结尾,是否引发异常?

为什么Python不';如果查找和读取超过文件结尾,是否引发异常?,python,file,python-3.x,Python,File,Python 3.x,我正在编写单元测试,以查看如果我的代码在只读和二进制模式(rb模式)下打开的二进制文件的末尾进行查找和读取,会发生什么情况 我很确定在这种情况下会引发异常,但事实并非如此(在Python3.x上测试): 问题: 为什么允许这种行为(继承自C?)?我了解文件在写模式下的行为,但不了解只读模式下的行为 读取超过文件末尾是否视为未定义行为?它是否总是返回空的字节?它是实现定义的吗 编辑:将模式从r+b更改为rb,此时行为仍然相同。您的问题询问了读取模式,但您的代码显示了读写模式。查找超过可写文件结

我正在编写单元测试,以查看如果我的代码在只读和二进制模式(
rb
模式)下打开的二进制文件的末尾进行查找和读取,会发生什么情况

我很确定在这种情况下会引发异常,但事实并非如此(在Python3.x上测试):

问题:

  • 为什么允许这种行为(继承自C?)?我了解文件在写模式下的行为,但不了解只读模式下的行为
  • 读取超过文件末尾是否视为未定义行为?它是否总是返回空的
    字节
    ?它是实现定义的吗

编辑:将模式从
r+b
更改为
rb
,此时行为仍然相同。

您的问题询问了读取模式,但您的代码显示了读写模式。查找超过可写文件结尾的文件不是错误,因为执行后续写入将导致在支持该文件的文件系统上出现错误(并且在不支持该文件的文件系统上进行新写入之前,零填充)。

@Alik:这些文件对于Py3不正确;他们描述了它在Py3中的包装
fread
,所有缓冲都直接用Python实现。@ShadowRanger oops,我没有注意Python版本OP使用。
+
添加到任何
r
w
a
文件模式指定文件将以读写模式打开。二进制只读模式是
rb
,而不是
r+b
。这个页面上有一个很好的文件模式表:@Nikita:好的,谢谢你的评论,我不知道。我用
rb
模式编辑了这个问题,而不是
r+b
。行为还是一样的。你能详细说明一下“读写模式”吗?我真的认为
r+b
意味着“只读和二进制模式”(我也尝试了
rb
)。我错了吗?试图写入文件会引发一个
io。不支持操作:write
异常。@Neitsa:Python尽可能遵循C的
fopen(3)
标志<代码>“r+”以读写模式打开现有文件。只读和二进制只是
“rb”
。。。谢谢你的精确性。我也试过使用rb,但是行为还是一样的,我仍然可以通过文件的结尾阅读,这对我来说是非常荒谬的。
>>> 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''
>>>