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>
答案 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()
时保存的绝对位置,而不是任意计算的位置。