我正在尝试使用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
? Does tell
执行一些影响迭代器的状态更改或类似的操作?
我可能应该提到我正在 Anaconda 环境中运行 Python 3.6.2。我在 Arch Linux 和 Red Hat 7.5 上都观察到了这种行为。
Update
这个问题似乎以不同的形式出现在Python 2.7中:file.tell() 不一致 https://stackoverflow.com/q/14145082/2988730。不知道是不是缓冲优化导致的不一致的原因tell
在 Python 3 中被完全禁用。
这实际上带来了一个更深层次的问题,这就是为什么操作系统级别的文件指针被返回tell
Python 文件接口的目标是抽象出来吗?这并不像Python级别指针的位置是模糊或神秘的,有或没有缓冲。