2015-06-17 10 views
10

Я пытаюсь создать скрипт для распаковки всех файлов .tar.gz из папок в одном каталоге. Например, у меня будет файл, который он вызывает (testing.tar.gz). Затем, если я сделаю это вручную, я могу нажать «извлечь здесь», тогда файл .tar.gz создаст новый файл и вызовет test.tar. Наконец, если я повторяю процесс нажатия «extract here», файл .tar выводит мне все файлы .pdf.Я хочу создать сценарий для файла unzip (.tar.gz) через (Python)

Интересно, как я могу это сделать, и у меня есть мой код здесь, и кажется, что это не работает на рынке недвижимости.

import os 
import tarfile 
import zipfile 

def extract_file(path, to_directory='.'): 
    if path.endswith('.zip'): 
     opener, mode = zipfile.ZipFile, 'r' 
    elif path.endswith('.tar.gz') or path.endswith('.tgz'): 
     opener, mode = tarfile.open, 'r:gz' 
    elif path.endswith('.tar.bz2') or path.endswith('.tbz'): 
     opener, mode = tarfile.open, 'r:bz2' 
    else: 
     raise ValueError, "Could not extract `%s` as no appropriate extractor is found" % path 

    cwd = os.getcwd() 
    os.chdir(to_directory) 

    try: 
     file = opener(path, mode) 
     try: file.extractall() 
     finally: file.close() 
    finally: 
     os.chdir(cwd) 
+1

Если нет смысла использовать Python, это похоже на работу, наиболее подходящую для сценария оболочки. – mfaerevaag

+1

extractall принимает целевой каталог как параметр, не нужно chdir взад и вперед. –

ответ

24

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

import tarfile 
mode = "r:gz" if (fname.endswith("tar.gz")) else "r:" 
tar = tarfile.open(fname, mode) 
tar.extractall() 
tar.close() 
+0

Это потому, что, похоже, у файла есть (.tar.gz). Но процесс распаковки, он должен быть извлечен из (.tar.gz) в (.gz), затем извлечение еще раз выдаст необходимую мне информацию .pdf-файл и т. Д. – Alex

+0

, и ваш код не работает: if (fname.endswith ("tar.gz")): NameError: name 'fname' не определен – Alex

+2

@Alex 'fname' будет строкой, которая является вашим именем файла. –

 Смежные вопросы

  • Нет связанных вопросов^_^