0

我已经看到了这个问题,但我需要别的东西。

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

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

它将打印所有文件,它们有数十万个,我不希望这样,但我不知道如何设置它。

4

2 回答 2

2

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
于 2015-02-06T22:47:27.573 回答
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>
于 2015-02-07T16:28:33.493 回答