首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在tar gzipped文件中逐行解析gzipped日志文件

在tar gzipped文件中逐行解析gzipped日志文件
EN

Stack Overflow用户
提问于 2013-06-05 18:21:33
回答 2查看 1.1K关注 0票数 2

我有以下日志文件的结构:

代码语言:javascript
运行
复制
/var/log/2013-12-24.tar.gz

此文件包含:

代码语言:javascript
运行
复制
2013-12-24/{00,01,02...23}.log.gz 

文件

我需要使用Python解析这些文件,

而不提取磁盘或内存上的任何文件

有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-05 18:35:05

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

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

可以在不读取整个文件的情况下扫描.tar文件,但只有当tar归档的成员相对较大时,它才能很好地工作。这是因为tar没有在一个紧凑的地方列出所有成员的头。每个归档成员都有512个字节的描述符,然后显示下一个成员的位置。对于大型归档成员,您可以相对快速地在磁盘上找到任意成员内容,但您必须多次使用lseek()

但是,一旦在.tar之上应用gzip,基本上就不可能快速获得存档的所有成员的列表,更不用说实际解压它们的内容了。您被迫解压缩整个归档,甚至只是为了获得其所有成员的列表。

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-06-12 15:22:53

我找到了一个解决方案。我只在这里给出它作为参考:

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16937391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档