我正在使用 python3.2 解析大小为 1 到 10GB 的日志文件,需要搜索具有特定正则表达式(某种时间戳)的行,并且我想找到最后一次出现的情况。
我尝试过使用:
for line in reversed(list(open("filename")))
这导致了非常糟糕的性能(在好的情况下)和 MemoryError 在坏的情况下。
在线程中:使用python以相反的顺序读取文件 https://stackoverflow.com/questions/2301789/read-a-file-in-reverse-order-using-python我没有找到任何好的答案。
我找到了以下解决方案:python 按行读取文本文件的头、尾和向后 https://stackoverflow.com/questions/5896079/python-head-tail-and-backward-read-by-lines-of-a-text-file/5896210#5896210非常有前途,但是它不适用于 python3.2,因为错误:
NameError: name 'file' is not defined
我后来尝试更换File(file)
with File(TextIOWrapper)
因为这是对象内置函数open()
返回,但这导致了更多错误(如果有人建议这是正确的方法,我可以详细说明:))
这是一个可以完成您正在寻找的功能的函数
def reverse_lines(filename, BUFSIZE=4096):
f = open(filename, "rb")
f.seek(0, 2)
p = f.tell()
remainder = ""
while True:
sz = min(BUFSIZE, p)
p -= sz
f.seek(p)
buf = f.read(sz) + remainder
if '\n' not in buf:
remainder = buf
else:
i = buf.index('\n')
for L in buf[i+1:].split("\n")[::-1]:
yield L
remainder = buf[:i]
if p == 0:
break
yield remainder
它的工作原理是从文件末尾读取缓冲区(默认为 4kb)并反向生成其中的所有行。然后向后移动 4k,并执行相同操作,直到文件开头。代码可能需要在内存中保留超过 4k 的空间,以防正在处理的部分中没有换行(非常长的行)。
您可以使用代码作为
for L in reverse_lines("my_big_file"):
... process L ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)