2

I have the following structure for log files:

/var/log/2013-12-24.tar.gz

This file has :

2013-12-24/{00,01,02...23}.log.gz 

files

I need to parse these files, using Python,

without extracting any files on disk OR memory

Any suggestions ?

4

2 回答 2

1

这是不可能的.tar.gz,这就是原因。

为了创建.tar.gz文件,您必须tar先创建单个.tar文件,然后再创建gzip结果。

.tar文件可以在不阅读整个文件的情况下被扫描,但只有在tar档案成员相对较大的情况下才能正常工作。这是因为tar没有任何标题在一个紧凑的地方列出所有成员。每个归档成员都有 512 字节的描述符,而不是显示下一个所在的位置。使用大型存档成员,您可以相对快速地在磁盘上找到任意成员内容,但您将不得不lseek()多次这样做。

但是,一旦您gzip在 之上申请.tar,基本上就无法快速获取存档所有成员的列表,更不用说实际解压缩他们的内容了。即使只是简单地获取其所有成员的列表,您也被迫解压缩整个存档。

.tar.bz2请注意,流行或.tar.xz格式存在完全相同的问题。

您可以使用zip格式修复它。zip比它有很大的优势,.tar.gz因为它确实有一个紧凑的索引,可以在一个地方列出所有存档成员,并且它允许快速读取该列表并仅提取您需要的文件,而无需提取 (gunzip).tar.gz遭受的整个存档。

于 2013-06-05T10:35:04.633 回答
0

我找到了解决方案。我只是在这里提供以供参考:

import subprocess
file_name = /var/log/2013-06-10.tar.gz
gzip_data = subprocess.Popen(["tar", "-Oxf", file_name], stdout=subprocess.PIPE)
data = subprocess.Popen(["zcat"], stdin=gzip_data.stdout, stdout=subprocess.PIPE)
for line in data.stdout:
    do_my_process_on(line)
于 2013-06-12T07:22:52.513 回答