您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python file.tell提供错误的值位置

Python file.tell提供错误的值位置

在文档中(相当模糊)解释了文件对象next()方法的原因:

文件用作迭代器时,通常在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")
python 2022/1/1 18:47:06 有339人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶