在python中使用ftell()遍历for循环时出现意外的文件指针位置

时间:2017-07-02 11:46:18

标签: python python-2.7

获得以下代码的意外输出:

sample.txt包含:

  

这是第一行   这是第二行   这是第三行   这是第四行   这是第五行   这是第六行

代码:

import sys  

f1=open("sample3.txt",'r')  

print f1.tell()  

for line in f1:  
    print line  
    print "postion of the file pointer",f1.tell()  

输出:

0  
this is the first line  
postion of the file pointer 141  
this is the second line  
postion of the file pointer 141  
this is the third line  
postion of the file pointer 141  
this is the fourth line  
postion of the file pointer 141  
this is the fifth line  
postion of the file pointer 141  
this is the sixth line  
postion of the file pointer 141  

我希望显示文件指针位置的内容是每行的结尾

2 个答案:

答案 0 :(得分:1)

我在文档中找到了相关部分:

  

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

答案 1 :(得分:0)

迭代文件对象时,

tell()不起作用。 由于对更快读取的一些优化,一旦开始迭代,文件中的实际当前药水就没有意义。

Python 3在这里提供了更多帮助:

OSError: telling position disabled by next() call

使用readline()效果更好:

from __future__ import print_function

f1 = open('sample3.txt')
line = f1.readline()
while line:
    print(line)
    print("postion of the file pointer", f1.tell() )
    line = f1.readline()