在python中导航一个大的tar.gz文件而不先提取它

时间:2015-02-06 21:08:39

标签: python tableofcontents tarfile

我见过这个question,但我需要别的东西。

我的文件包含由变量名组织的大量文本文件(数十万个)。 像

这样的东西
filename/maxvalue/IDXstation.txt     (with X that goes from 100000 to 200000)
filename/minvalue/IDXstation.txt  
filename/meanvalue/IDXstation.txt 

等等。 问题是我没有readme.txt文件,告诉我tar文件中有多少个文件夹或者它们是如何命名的(我编写了它们)(或者每个文件夹中有多少个站点)。 现在我所关注的只是filename.tar.gz的结构并打印出类似

的内容
filename/maxvalue/  
filename/minvalue/  
filename/meanvalue/

我需要在开始提取文件之前阅读它的结构,因为我只对某些文件夹感兴趣而不是所有文件夹。

如果我使用

for tarinfo in tar:
    print tarinfo.name

它将打印所有文件,它们是数十万,我不想要,但我不知道如何设置它。

2 个答案:

答案 0 :(得分:2)

wikipedia page on tar列出档案中文件的名称,必须读取整个档案并查找文件开始的位置。因此,您必须解压缩数据流以获取文件名。仅打印预期名称的一种简单方法是使用正则表达式仅保留相关的目录名称。如果您确定目录本身已在tar文件中注册,那么这样就足够了:

import re

rx = re.compile('[^/]+\/[^/]\/?$')
...
for tarinfo in tar:
    if rx.match(tarinfo.name):
        print tarinfo.name

如果您不确定已在tarfile中注册已驱逐的目录,则可以使用不太严格的匹配将目录部分放入集合中。类似的东西:

import re

rx = re.compile('([^/]+\/[^/])\/')
...
names = set()
for tarinfo in tar:
    if rx.match(tarinfo.name):
        names.add(tarinfo.name)
for name in names:
    print name
        print tarinfo.name

答案 1 :(得分:1)

要在tar存档中打印顶级目录,例如,直到第二级:

#!/usr/bin/env python
import sys
import tarfile

with tarfile.open(sys.argv[1]) as archive:
    for member in archive:
        if member.isdir() and member.name.count('/') < 2:
            print(member.name)

用法:

$ print-top-level-dirs <tar-archive>