为什么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''
>>>