【问题标题】:Why Python doesn't raise an exception if seeking and reading past the end of a file?如果在文件末尾查找和读取,为什么 Python 不会引发异常?
【发布时间】: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,行为仍然相同。

【问题讨论】:

标签: python file python-3.x


【解决方案1】:

您的问题询问了读取模式,但您的代码演示了读写模式。越过可写文件的末尾寻找不是错误,因为执行后续写入将导致在支持它的文件系统上出现sparse file(并且在不支持它的文件系统上进行新的写入之前会填零)。

【讨论】:

  • 能否详细说明“读写模式”?我真的认为r+b 的意思是“只读 和二进制模式”(我也尝试过rb 以确保)。我错了吗?尝试写入文件会引发io.UnsupportedOperation: write 异常。
  • @Neitsa:Python 尽可能遵循 C 的 fopen(3) 标志。 "r+" 以读写模式打开现有文件。只读和二进制只是"rb"
  • 哦,好吧,该死的......谢谢你的精确。然后我也尝试了rb,但行为仍然相同,我仍然可以越过文件末尾阅读这对我来说非常荒谬。
猜你喜欢
  • 1970-01-01
  • 2011-05-11
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多