2015-02-06 10 views
0

Я видел это question, но мне нужно что-то еще.Перемещение большого файла 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 или как они названы (я их создал) (или сколько станций в каждой папке). Сейчас мне все равно читать это структура FILENAME.tar.gz и печати что-то вроде

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

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

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

for tarinfo in tar: 
    print tarinfo.name 

Он будет печатать все файлы, и они сотни тысяч, и я не хочу, но я не уверен, как настроить его.

+0

Вы хотите напечатать все имена каталогов в архив? Какие папки вам интересны? – jfs

+0

Да, имена каталогов до второго уровня (имеет смысл?) имя_файла/variablename/ – claire

+1

Если вам нужно найти структуру, я предлагаю вам использовать стандартные инструменты командной строки. В любом случае вам нужно разархивировать поток данных, нет никакого способа обойти. После этого команда «tar» предоставляет множество опций, чтобы «заглянуть» в архив. –

ответ

1

Для печати каталогов верхнего уровня в деготь архив, например, до величин второго уровня:

#!/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> 
+0

Это сработало отлично !!! Это очень полезно, спасибо много JF. – claire

2

wikipedia page on tar говорит перечислить имена файлов, находящихся в архиве, необходимо прочитать весь архив и искать места, где файлы начинаются. Таким образом, вам придется распаковать поток данных, чтобы получить имена файлов. Один простой способ печатать только ожидаемые имена - это использовать регулярное выражение для хранения только соответствующих имен каталогов. Если вы уверены, что каталог сами регистрируются в дегтя файл что-то вроде этого должно быть достаточно:

import re 

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

Если вы не уверены в том, что expexted каталоги зарегистрированы в файл обработан, вы можете использовать менее строгий матч пут часть каталога в наборе. Что-то вроде:

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 
+0

Я попробую, спасибо. – claire