Почему функция извлечения перестала извлекать? - PullRequest
0 голосов
/ 13 июня 2011

Может ли кто-нибудь объяснить и помочь мне решить, почему моя функция перестала извлекать файлы .tgz, когда я добавил счетчик для создания папок с разными именами, чтобы не дать извлеченной папке перезаписать предыдущую, когда я извлек другой файл .tgz в том же каталоге?Что я делаю неправильно?Спасибо!Ниже приведены две функции ... первая функция правильно извлекает файлы;вторая функция извлекает нумерованную папку и завершает работу.

Работает:

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

Не работает:

 global counter
 counter=1

 def extract(tar_url, extract_path='.'):
      global counter
      print tar_url
      tar = tarfile.open(tar_url, 'wb')# changed from r to wb 6/12
      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('/')])

Вот как я называю ее в основном (яиспользую easygui):

  direct = diropenbox(msg="Choose path to place extracted files!", title='SQA Extractor', default='c:\\Extracted')          
  msg = "Are you sure you want to extract?"
  title = "Confirm"
  os.chdir(direct)      

  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))      

Ответы [ 3 ]

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

Возможно, именно это изменение нарушило ваш код:

tar = tarfile.open(tar_url, 'r')

Изменено на:

tar = tarfile.open(tar_url, 'wb')# changed from r to wb 6/12
0 голосов
/ 13 июня 2011

Исходная версия основана на именах созданных папок, соответствующих относительным путям, указанным в архиве.В новой версии рекурсивный вызов пытается поместить файлы в папку без номера «тега», после извлечения других файлов на этом уровне в тот, который делает.

Попробуйте добавить тег к имени путитакже используется для рекурсивного вызова.

Кстати, Python-идиоматическое написание item.name.find(".tar") != -1 равно '.tar' in item.name.

0 голосов
/ 13 июня 2011

Существует ли путь извлечения со счетчиком?

  for item in tar:
      os.mkdir(extract_path + "_%d" % counter)
      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('/')])
...