如何在python3.2中以相反的顺序读取文件而不将整个文件读取到内存? [复制]

2024-02-01

我正在使用 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(使用前将#替换为@)

如何在python3.2中以相反的顺序读取文件而不将整个文件读取到内存? [复制] 的相关文章

随机推荐