在迭代期间查找文件中的位置

时间:2018-01-02 03:55:27

标签: python python-3.x file tell

我试图在迭代期间在普通文本文件中使用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会被禁用,因为大多数迭代器不喜欢并发修改,但为什么telltell是否会执行某些影响迭代器的状态更改或类似的事情?

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

更新

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

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

0 个答案:

没有答案