Поиск позиции в файле во время итерации
Я пытаюсь использовать 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 неоднозначно или загадочно, с буферизацией или без нее.