4

我试图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在迭代期间禁用 using 。seek鉴于大多数迭代器不喜欢并发修改,我可以理解为什么会被禁用,但为什么tell呢?是否tell执行一些影响迭代器的状态更改或类似的事情?

我可能应该提到我在 Anaconda 环境中运行 Python 3.6.2。我在 Arch Linux 和 Red Hat 7.5 上都观察到了这种行为。

更新

这个问题似乎以不同的形式出现在 Python 2.7 中:file.tell() inconsistency。我想知道缓冲优化引起的不一致是否tell是 Python 3 中完全禁用的原因。

这实际上提出了一个更深层次的问题,那就是为什么tell当 Python 文件接口的目标是从中抽象出来时,操作系统级别的文件指针会被完全返回?这并不像 Python 级别指针的位置是模棱两可或神秘的,有或没有缓冲。

4

0 回答 0