2015-06-17 70 views
10

Sto provando a creare uno script per decomprimere tutti i file .tar.gz dalle cartelle in una directory. Ad esempio, avrò un file che chiama (testing.tar.gz). Quindi se faccio manualmente, posso premere per "estrarre qui", quindi il file .tar.gz creerà un nuovo file e chiama testing.tar. Infine, se ripeto il processo di premere "estrai qui", il file .tar mi produce tutti i file .pdf.Voglio creare uno script per decomprimere (.tar.gz) file via (Python)

Mi chiedo come posso farlo, e ho il mio codice qui e sembra non funzionare in realtà tho.

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

A meno che non ci sia un punto nell'uso di Python, sembra un lavoro che si adatta meglio allo script di shell. – mfaerevaag

+1

extractall prende la directory di destinazione come parametro, non c'è bisogno di chdir avanti e indietro –

risposta

24

Perché si desidera "premere" due volte per estrarre un .tar.gz, quando è possibile farlo facilmente una volta? Ecco un semplice codice per estrarre sia .tar che .tar.gz in una volta:

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

È perché, sembra che il file che ho è (.tar.gz). Ma il processo di decompressione, deve essere estratto da (.tar.gz) a (.gz), quindi estrarre ancora una volta fornirà le informazioni che mi servono come file .pdf ecc. – Alex

+0

e il tuo codice non funziona: if (fname.endswith ("tar.gz")): NameError: nome 'fname' non è definito – Alex

+2

@Alex 'fname' sarebbe una stringa che è il nome del file. –

Problemi correlati