是否有人碰巧知道为什么当您以这种方式遍历文件时:输入:f = open('test.txt', 'r')for line in f: print "f.tell(): ",f.tell()输出:f.tell(): 8192f.tell(): 8192f.tell(): 8192f.tell(): 8192我总是从tell()那里得到错误的文件索引,但是,如果我使用readline,则会得到tell()的适当索引:输入:f = open('test.txt', 'r')while True: line = f.readline() if (line == ''): break print "f.tell(): ",f.tell()输出:f.tell(): 103f.tell(): 107f.tell(): 115f.tell(): 124我正在运行python 2.7.1 BTW。
3 回答

Smart猫小萌
TA贡献1911条经验 获得超7个赞
将打开的文件用作迭代器可使用预读缓冲区来提高效率。结果,当您遍历行时,文件指针将在文件中大步前进。
从文件对象文档中:
为了使for循环成为遍历文件行的最有效方法(一种非常常见的操作),该next()方法使用了隐藏的预读缓冲区。由于使用了预读缓冲区,因此无法next()与其他文件方法(例如readline())结合使用。但是,seek()用于将文件重新定位到绝对位置将刷新预读缓冲区。
如果您需要依赖.tell(),请不要将文件对象用作迭代器。您可以.readline()改为使用迭代器(以性能损失为代价):
for line in iter(f.readline, ''):
print f.tell()
这使用iter()function sentinel参数将任何可调用对象转换为迭代器。
添加回答
举报
0/150
提交
取消