可能重复:
如何在不阅读其全部内容的情况下跟踪压缩文件?
我有一个 7GB 的 gzip 系统日志文件,可以提取到超过 25GB。我只需要检索文件的第一行和最后一行,而不需要一次将整个文件读入内存。
GzipFile()
在 Python 2.7 中允许使用with
来读取头部(通过迭代with
意味着我不必读取整个文件):
>>> from itertools import islice
>>> from gzip import GzipFile
>>> with GzipFile('firewall.4.gz') as file:
... head = list(islice(file, 1))
>>> head
['Oct 2 07:35:14 192.0.2.1 %ASA-6-305011: Built dynamic TCP translation
from INSIDE:192.0.2.40/51807 to OUTSIDE:10.18.61.38/2985\n']
Python 2.6 版本以避免诸如AttributeError: GzipFile instance has no attribute '__exit__'
(因为GzipFile()不支持GzipFile(with
)上的迭代)等问题...
>>> from itertools import islice
>>> from gzip import GzipFile
>>> class GzipFileHack(GzipFile):
... def __enter__(self):
... return self
... def __exit__(self, type, value, tb):
... self.close()
>>> with GzipFileHack('firewall.4.gz') as file:
... head = list(islice(file, 1))
问题是我无法检索尾部...islice()
不支持负值,并且如果不遍历 25GB 文件(这需要太长时间),我找不到检索最后一行的方法。
在不将整个文件读入内存或遍历所有行的情况下,读取 gzip 文本文件尾部的最有效方法是什么?如果无法做到这一点,请说明原因。