我不明白为什么tell()函数在这种情况下不起作用。让我们创建一个包含字符串"1\n2\n3\n4\n“的文件:
f=open('test.tmp','w')
f.write('1\n2\n3\n4\n')
f.close()现在,让我们打开它并运行以下代码:
fTellResults=[]
f=open('test.tmp','r+')
for line in f:
fTellResults.append(f.tell())
f.close()
print fTellResults结果,我得到了:
[8L, 8L, 8L, 8L]然而,我更希望是这样的:
[2L, 4L, 6L, 8L]有人能给我解释一下为什么会这样吗?我怎么才能得到预期的结果呢?
附注:我在Linux上使用Python 2.7.1
发布于 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给出的位置是不正确的,因为文件已经被读取到预读缓冲区。
发布于 2011-12-02 06:03:06
问题在于,for line in f:会导致在执行循环之前读取所有行。因此,在循环的每次迭代中,tell()在文件的末尾保持不变。为了获得所需的行为,您需要在循环内执行readline
https://stackoverflow.com/questions/8348798
复制相似问题