2015-06-17 11 views
10

Próbuję utworzyć skrypt do rozpakowania wszystkich plików .tar.gz z folderów w jednym katalogu. Na przykład, będę miał plik, który wywoła (testing.tar.gz). Jeśli zrobię to ręcznie, mogę nacisnąć "wyodrębnij tutaj", a plik .tar.gz utworzy nowy plik i wywoła testing.tar. Na koniec, jeśli powtórzę proces naciśnięcia "extract here", plik .tar prodcudes me wszystkie pliki .pdf.Chcę utworzyć skrypt dla pliku unzip (.tar.gz) za pośrednictwem (Python)

Zastanawiam się, jak mogę to zrobić, i mam tutaj swój kod i wygląda na to, że nie działa.

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

O ile nie ma sensu używanie Pythona, brzmi to jak praca najlepiej pasująca do skryptu powłoki. – mfaerevaag

+1

extractall przyjmuje katalog docelowy jako parametr, nie trzeba chdir tam iz powrotem –

Odpowiedz

24

Dlaczego chcesz "nacisnąć" dwa razy, aby wyodrębnić plik .tar.gz, kiedy możesz go łatwo zrobić raz? Oto prosty kod do wyodrębniania plików .tar i .tar.gz za jednym razem:

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

To dlatego, że wyglądam jak plik, który mam (.tar.gz). Ale proces rozpakowywania, musi być rozpakowany z (.tar.gz) do (.gz), a następnie wyodrębnić jeszcze raz, wyda potrzebne informacje, takie jak plik .pdf itp. – Alex

+0

i twój kod nie działa: if (fname.endswith ("tar.gz")): NameError: nazwa 'fname' nie jest zdefiniowana – Alex

+2

@Alex 'fname' będzie ciągiem znaków, który jest Twoją nazwą. –

Powiązane problemy