为什么只能从文本文件的开头“查找”?

时间:2019-10-26 13:54:55

标签: python python-3.x

Python documentation说:

  

仅在文本文件(模式字符串中打开时没有b的文本文件)中,   相对于文件开头的搜索是允许的(例外   正在以seek(0, 2)结尾的文件结尾。

确实,这失败了:

with open(filename, 'rt') as f:
    f.seek(2, os.SEEK_SET)
    f.seek(2, os.SEEK_CUR)

Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
io.UnsupportedOperation: can't do nonzero cur-relative seeks

问题

我可以轻松地将每个f.seek(offset, os.SEEK_CUR)替换为f.seek(f.tell() + offset, os.SEEK_SET),那么,为什么Python本身不这样做呢?

这有效:

with open(filename, 'rt') as f:
    f.seek(2, os.SEEK_SET)
    f.seek(f.tell() + 2, os.SEEK_SET)

我想念什么吗?有时会失败吗?我应该注意些什么?

我可以想象到查找多字节UTF-8序列中间的问题,但是我看不出无论是从SEEK_SET还是SEEK_CUR进行查找,这都有什么区别。 / p>

1 个答案:

答案 0 :(得分:2)

我怀疑只允许使用f.seek(f.tell() + 2, os.SEEK_SET),因为实现无法将其与f.seek(f.tell(), os.SEEK_SET)区分开。来自documentation for seek

  

SEEK_SET或0:从流的开头开始搜索(默认); offset必须是TextIOBase.tell()返回的数字或零。任何其他偏移值都会产生不确定的行为。

由于f.tell() + 2不是f.tell()返回的值,所以这是未定义的行为,因为您不应该知道f.tell()的返回值代表什么,因此加2没什么意义。

想法是,允许的 搜索仅是您以前调用f.tell()时保存的绝对位置,而不是任意计算的位置。