2011-11-24 17 views
7

Ho un archivio tar in cui ho una directory che ho bisogno di estrarre in una determinata directory. Per esempio: Ho una directoryEstrai tutti i file con percorso di directory nella directory data

TarPrefix/x/y/z

in un archivio tar voglio estrarlo in una data directory di destinazione, ad esempio: estratto/a/questa directory dovrebbe contenere tutti i file e le directory contenuti nella directory TarPrefix/x/y/z.

subdir_and_files = [ tarinfo for tarinfo in tar.getmembers() 
         if tarinfo.name.startswith("subfolder/") 
        ] 

per ottenere l'elenco di tutti i membri del percorso della directory "sottocartella /" e poi ho estrarre utilizzando tar.extractall(extracted/a,subdir_and_files) ma estrae tutti i membri con il loro percorso di directory Per esempio, questo si traduce in estratta/a/x/y/z. Potresti aiutarmi ad estrarre questi file nella cartella indicata.

+0

Non lo so, ma la questione sembra essere una sorta di l'opposto del tuo: http: //stackoverflow.com/questions/2239655/python-tarfile-adding-files-without-directory-hiearchy Forse puoi usare extract() piuttosto che extractall() e vedere cosa puoi realizzare, eventualmente modificando gli oggetti di TarInfo che ottenuto in subdir_and_files? –

+1

Mi dispiace per la domanda di un principiante. Sono un principiante in Python e non ho trovato alcuna risposta su google, ecco perché mi sono posto una domanda del genere. Per aiutare gli altri, voglio rispondere a questa domanda. Hai solo bisogno di cambiare il valore dell'attributo tarinfo.name al valore corretto. cioè nel mio esempio dato 'tarinfo.name = tarinfo.name [len (Tarprefix/x/y/z):]' e quindi usa lo stesso codice funziona. – gaurav

+0

Ho provato a rispondere alla mia domanda, ma non sono autorizzato fino a otto ore, quindi ho aspettato fino ad allora. – gaurav

risposta

12

Sembra che si può avere già trovato una risposta, ma ecco la mia versione in ogni caso:

import sys, tarfile 

def get_members(tar, prefix): 
    if not prefix.endswith('/'): 
     prefix += '/' 
    offset = len(prefix) 
    for tarinfo in tar.getmembers(): 
     if tarinfo.name.startswith(prefix): 
      tarinfo.name = tarinfo.name[offset:] 
      yield tarinfo 

args = sys.argv[1:] 

if len(args) > 1: 
    tar = tarfile.open(args[0]) 
    path = args[2] if len(args) > 2 else '.' 
    tar.extractall(path, get_members(tar, args[1])) 
+0

Grazie per l'aiuto. Ya ho trovato la risposta sperimentando cose :) Comunque grazie mille. – gaurav

2
with tarfile.open('sourcefile.tgz', 'r:gz') as _tar: 
    for member in _tar: 
     if member.isdir(): 
     continue 
     fname = member.name.rsplit('/',1)[1] 
     _tar.makefile(member, 'desination_dir' + '/' + fname) 
+0

descrivi qualcosa sulla tua risposta. – Satendra

Problemi correlati