Навигация по большому файлу tar.gz в python без его предварительного извлечения

Я видел это вопрос, но мне нужно кое-что еще.

Мои файлы содержат очень большое количество текстовых файлов (сотни тысяч), организованных по имени переменной. Что-то типа

filename/maxvalue/IDXstation.txt     (with X that goes from 100000 to 200000)
filename/minvalue/IDXstation.txt  
filename/meanvalue/IDXstation.txt 

и так далее. Проблема в том, что у меня нет файлов readme.txt, в которых указано, сколько папок в tar-файлах или как они называются (я их придумал) (или сколько станций в каждой папке). На данный момент все, что мне нужно, это прочитать структуру имени файла.tar.gz и напечатать что-то вроде

filename/maxvalue/  
filename/minvalue/  
filename/meanvalue/

Мне нужно прочитать его структуру, прежде чем я начну извлекать файл, потому что меня интересуют только некоторые папки, а не все.

если я использую

for tarinfo in tar:
    print tarinfo.name

Он распечатает все файлы, а их сотни тысяч, и мне это не нужно, но я не знаю, как это настроить.


person claude    schedule 06.02.2015    source источник
comment
Вы хотите распечатать имена всех каталогов в архиве? Какие папки вас интересуют?   -  person jfs    schedule 07.02.2015
comment
Да, имена каталогов до второго уровня (имеет смысл?) имя_файла/имя_переменной/   -  person claude    schedule 07.02.2015
comment
Если речь идет только о поиске структуры, я предлагаю вам использовать стандартные инструменты командной строки. В любом случае нужно разархивировать поток данных, другого выхода нет. После этого команда tar предоставляет множество возможностей для просмотра архива.   -  person Dr. Jan-Philip Gehrcke    schedule 07.02.2015
comment
спасибо - это кажется разумным, я не думал об этом.   -  person claude    schedule 07.02.2015
comment
@chiara, что вы имели в виду под средним значением в своем примере? Это просто какое-то имя, расположенное в середине длинного списка имен?   -  person artemdevel    schedule 07.02.2015
comment
нет, среднее значение было просто вымышленным именем папки.   -  person claude    schedule 07.02.2015


Ответы (2)


Чтобы распечатать каталоги верхнего уровня в 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>
person jfs    schedule 07.02.2015

На странице википедии на 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
person Serge Ballesta    schedule 06.02.2015