我试图在迭代期间在普通文本文件中使用f.tell()
:
with open('test.txt') as f:
for line in f:
print(f.tell())
我收到以下错误:
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
OSError: telling position disabled by next() call
为了确保,我检查了如果我尝试手动跳过一行,丢弃迭代器对象(可能是文件本身),则会发生同样的错误:
with open('test.txt') as f:
next(f)
print(f.tell())
我的最终目标是找到文件中第一行的长度(以字节为单位),无论平台如何,因此以下工作正常:
with open('test.txt') as f:
f.readline()
print(f.tell())
我很好奇为什么在迭代期间禁用tell
。我可以理解为什么seek
会被禁用,因为大多数迭代器不喜欢并发修改,但为什么tell
? tell
是否会执行某些影响迭代器的状态更改或类似的事情?
我应该提一下,我在Anaconda环境中运行Python 3.6.2。我在Arch Linux和Red Hat 7.5上都观察到了这种行为。
更新
这个问题似乎以不同的形式出现在Python 2.7中:file.tell() inconsistency。我想知道缓冲优化引起的不一致是否是{3}在Python 3中被完全禁用的原因。
这实际上提出了一个更深层次的问题,这就是为什么当Python文件接口的目标是抽象出来时,操作系统级文件指针完全由tell
返回?它不像Python级别指针的位置是模糊的或神秘的,有或没有缓冲。