在文档中(相当模糊)解释了文件对象
next()方法的原因:
当文件用作迭代器时,通常在for循环中(例如,对于f中的行:打印行),将重复调用next()方法。此方法返回下一个输入行,或者在命中EOF时引发StopIteration。为了使for循环成为遍历文件行的最有效方法(一种非常常见的操作),next()方法使用隐藏的预读缓冲区。使用预读缓冲区的结果是,将next()与其他文件方法(如readline())组合在一起无法正常工作。但是,使用seek()将文件重新定位到绝对位置将刷新预读缓冲区。
返回的值
tell()反映了此隐藏的预读缓冲区已到达的距离,通常比程序实际检索到的字符超出几千个字节。
对此没有任何可移植的方法。如果需要
tell()与阅读线混合使用,请改用文件的
readline()方法。为了获得可用的
tell()结果,要进行权衡是,使用遍历大文件
readline()通常比使用慢得多
forline in file_object:。
码
具体来说,将循环更改为此:
line = self.fh.readline()while line: if p.search(line): self.porSnipStartFPtr = self.fh.tell() sys.stdout.write("found regPorSnip") line = fh.readline()不过,我不确定那不是您真正 想要的 是:
tell()正在捕获 下一 行的开始位置。如果要在行的 开始 位置,则需要更改逻辑,如下所示:
pos = self.fh.tell()line = self.fh.readline()while line: if p.search(line): self.porSnipStartFPtr = pos sys.stdout.write("found regPorSnip") pos = self.fh.tell() line = fh.readline()或用“半圈”进行:
while True: pos = self.fh.tell() line = self.fh.readline() if not line: break if p.search(line): self.porSnipStartFPtr = pos sys.stdout.write("found regPorSnip")


