Поиск позиции в файле во время итерации

Я пытаюсь использовать 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 выполнить какое-то изменение состояния, которое влияет на итератор или что-то подобное?

Вероятно, я должен упомянуть, что я использую Python 3.6.2 в среде Anaconda. Я наблюдал такое поведение как в Arch Linux, так и в Red Hat 7.5.

Обновить

Эта проблема, кажется, появляется в Python 2.7 в другой форме: несоответствие file.tell(). Интересно, является ли несогласованность, вызванная оптимизацией буферизации, причиной tell полностью отключен в Python 3.

Это на самом деле поднимает более глубокий вопрос, поэтому указатель файла уровня ОС возвращается tell вообще, когда цель файлового интерфейса Python - абстрагироваться от этого? Это не так, как положение указателя уровня Python неоднозначно или загадочно, с буферизацией или без нее.

0 ответов

Другие вопросы по тегам