我对日志文件有以下结构:
/var/log/2013-12-24.tar.gz
此文件包含:
2013-12-24/{00,01,02...23}.log.gz
文件
我需要使用Python解析这些文件,
不提取磁盘或内存上的任何文件
有什么建议吗?
答案 0 :(得分: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
遭受的整个档案。
答案 1 :(得分: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)