首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >filehandle.tell()函数的奇怪行为

filehandle.tell()函数的奇怪行为
EN

Stack Overflow用户
提问于 2011-12-02 05:52:28
回答 2查看 177关注 0票数 2

我不明白为什么tell()函数在这种情况下不起作用。让我们创建一个包含字符串"1\n2\n3\n4\n“的文件:

代码语言:javascript
复制
f=open('test.tmp','w')
f.write('1\n2\n3\n4\n')
f.close()

现在,让我们打开它并运行以下代码:

代码语言:javascript
复制
fTellResults=[]
f=open('test.tmp','r+')
for line in f:
    fTellResults.append(f.tell())
f.close()
print fTellResults

结果,我得到了:

代码语言:javascript
复制
[8L, 8L, 8L, 8L]

然而,我更希望是这样的:

代码语言:javascript
复制
[2L, 4L, 6L, 8L]

有人能给我解释一下为什么会这样吗?我怎么才能得到预期的结果呢?

附注:我在Linux上使用Python 2.7.1

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-02 06:02:27

file.next()

文件对象是它自己的迭代器,例如iter(f)返回f(除非f是封闭的)。当文件用作迭代器时,通常在for循环(例如,for line in f: print line)中,会重复调用next()方法。此方法返回下一个输入行,或在文件打开以供读取时命中EOF时引发StopIteration (当文件打开以供写入时行为未定义)。为了使for循环成为循环遍历文件行的最有效方式(一个非常常见的操作),next()方法使用了一个隐藏的预读缓冲区。使用预读缓冲区的结果是,将next()与其他文件方法(如readline())组合在一起不能正常工作。但是,使用seek()将文件重新定位到绝对位置将刷新预读缓冲区。

基于此,我断言file.tell给出的位置是不正确的,因为文件已经被读取到预读缓冲区。

票数 3
EN

Stack Overflow用户

发布于 2011-12-02 06:03:06

问题在于,for line in f:会导致在执行循环之前读取所有行。因此,在循环的每次迭代中,tell()在文件的末尾保持不变。为了获得所需的行为,您需要在循环内执行readline

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8348798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档