我见过这个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
它将打印所有文件,它们是数十万,我不想要,但我不知道如何设置它。
答案 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>