当文件用作迭代器时,通常在for循环中(例如,对于f中的行:打印行),将重复调用next()方法。此方法返回下一个输入行,或者在命中EOF时引发StopIteration。为了使for循环成为遍历文件行的最有效方法(一种非常常见的操作),next()方法使用隐藏的预读缓冲区。使用预读缓冲区的结果是,将next()与其他文件方法(如readline())组合在一起无法正常工作。但是,使用seek()将文件重新定位到绝对位置将刷新预读缓冲区。
返回的值tell()
反映了此隐藏的预读缓冲区已到达的距离,通常比程序实际检索到的字符超出几千个字节。
对此没有任何可移植的方法。如果需要tell()
与阅读线混合使用,请改用文件的readline()
方法。为了获得可用的tell()
结果,要进行权衡是,使用遍历大文件readline()
通常比使用慢得多for line 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")