Я хочу извлечь все файлы .tgz и .tar в один каталог - PullRequest
2 голосов
/ 10 июня 2011

Я использую следующий код для извлечения файлов .tgz и .tar в один каталог, в котором находятся архивные файлы.Он отлично работает с одним файлом.Но когда я выбираю другой файл в том же каталоге для извлечения, текущая папка перезаписывается (все файлы извлекают корневую папку с именем хранилища).Я предполагаю, что это причина, почему файлы перезаписываются.Таким образом, я могу иметь только один извлеченный файл в каталоге одновременно.Я пытался придумать умный способ извлечь файлы в тот же каталог, возможно, назвать извлеченный файл чем-то уникальным, как только он будет извлечен.Тем не менее, я начинающий программист на Python и не обладаю техническим ноу-хау или интеллектуальным набором инструментов для выполнения такой задачи в настоящее время.Любая помощь приветствуется.В нынешнем виде мне нужно будет выбирать другой выходной каталог каждый раз, когда я хочу извлечь файл.

 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('/')])

 userpath = "Extracted"
 directory = os.path.join("c:\\", userpath)
 try:
    for root, dirname, files in os.walk(directory):
        for file1 in files:
            if file1.endswith(".tgz") or file1.endswith(".tar"):
                extract(os.path.join(root, file1))
                print 'Done!'
 except:
    name = os.path.basename(sys.argv[0])
    print name[:name.rfind('.')], '<filename>'

Ответы [ 3 ]

1 голос
/ 10 июня 2011

Почему вы не поддерживаете глобальный счетчик и не добавляете его к 'extract_path' в методе extract () каждый раз, когда файл извлекается? После извлечения (в конце метода extract ()) счетчик увеличивается.

import os, sys, tarfile

global counter
counter=1

def extract(tar_url, extract_path='.'):
     global counter
     print tar_url
     tar = tarfile.open(tar_url, 'r')
     for item in tar:
         tar.extract(item, extract_path+"_%d"%counter)
         counter+=1
         if item.name.find(".tgz") != -1 or item.name.find(".tar") != -1:
             extract(item.name, "./" + item.name[:item.name.rfind('/')])
0 голосов
/ 11 июня 2011

В данный момент я не могу проверить это, но не могли бы вы просто проверить, существует ли папка с именем элемента, а затем продолжить, если это так (в основном это)

def extract(tar_url, extract_path='.'):
     print tar_url
     tar = tarfile.open(tar_url, 'r')
     for item in tar:
         if(os.path.isdir(os.path.join(extract_path,item.name))):
             continue;
         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('/')])
0 голосов
/ 10 июня 2011

Если их не нужно извлекать все в одном и том же каталоге, вы можете добавить os.chdir, чтобы изменить ваш рабочий каталог на то, где находится tar.dirname в приведенном выше сценарии.

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

...