file.tell()不一致

是否有人碰巧知道为什么当您以这种方式遍历文件时:


输入:

f = open('test.txt', 'r')

for line in f:

    print "f.tell(): ",f.tell()

输出:

f.tell(): 8192

f.tell(): 8192

f.tell(): 8192

f.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(): 103

f.tell(): 107

f.tell(): 115

f.tell(): 124

我正在运行python 2.7.1 BTW。


慕码人2483693
浏览 688回答 3
3回答

Smart猫小萌

将打开的文件用作迭代器可使用预读缓冲区来提高效率。结果,当您遍历行时,文件指针将在文件中大步前进。从文件对象文档中:为了使for循环成为遍历文件行的最有效方法(一种非常常见的操作),该next()方法使用了隐藏的预读缓冲区。由于使用了预读缓冲区,因此无法next()与其他文件方法(例如readline())结合使用。但是,seek()用于将文件重新定位到绝对位置将刷新预读缓冲区。如果您需要依赖.tell(),请不要将文件对象用作迭代器。您可以.readline()改为使用迭代器(以性能损失为代价):for line in iter(f.readline, ''):    print f.tell()这使用iter()function sentinel参数将任何可调用对象转换为迭代器。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python