Я хочу извлечь файл .tgz и извлечь любые подкаталоги, которые имеют файлы .tgz и .tar - PullRequest
11 голосов
/ 19 мая 2011

Я использую приведенный ниже код для извлечения .tgz файлов. Типы файлов журналов (.tgz), которые мне нужно извлечь, имеют подкаталоги, в которых есть другие .tgz файлы и .tar файлы. Я тоже хочу извлечь их.

В конечном итоге я пытаюсь найти определенные строки во всех .log файлах и .txt файлах, которые могут появляться в .tgz файле.

Ниже приведен код, который я использую для извлечения файла .tgz. Я пытался понять, как извлечь вложенные файлы (.tgz и .tar). До сих пор я был неудачным.

import os, sys, tarfile

try:
    tar = tarfile.open(sys.argv[1] + '.tgz', 'r:gz')
    for item in tar:
        tar.extract(item)
    print 'Done.'
except:
    name = os.path.basename(sys.argv[0])
    print name[:name.rfind('.')], '<filename>'

1 Ответ

12 голосов
/ 19 мая 2011

Это должно дать вам желаемый результат:

import os, sys, tarfile

def extract(tar_url, extract_path='.'):
    print tar_url
    tar = tarfile.open(tar_url, 'r')
    for item in tar:
        tar.extract(item, extract_path)
        if item.name.find(".tgz") != -1 or item.name.find(".tar") != -1:
            extract(item.name, "./" + item.name[:item.name.rfind('/')])
try:

    extract(sys.argv[1] + '.tgz')
    print 'Done.'
except:
    name = os.path.basename(sys.argv[0])
    print name[:name.rfind('.')], '<filename>'

Как сказал @cularis, это называется рекурсией.

...