为了账号安全,请及时绑定邮箱和手机立即绑定

file.tell()不一致

file.tell()不一致

慕码人2483693 2019-12-03 11:22:15
是否有人碰巧知道为什么当您以这种方式遍历文件时:输入: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参数将任何可调用对象转换为迭代器。


查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 687 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号