2011-11-04 18 views
6

Pracuję nad projektem w Pythonie, w którym muszę wyodrębnić tylko podfolder archiwum tar, nie wszystkie pliki. Próbowałem użyćWyodrębnij tylko jeden katalog z tar

tar = tarfile.open(tarfile) 
tar.extract("dirname", targetdir) 

Ale to nie działa, to nie rozpakować dany podkatalog również bez wyjątku. Jestem początkującym w Pythonie. Również jeśli powyższa funkcja nie działa dla katalogów jaka jest różnica między tym poleceniem a tar.extractfile()?

+0

extractfile() nie zapisać plik na dysku, to po prostu daje Ci obiekt python. extract() zapisuje na dysk. –

Odpowiedz

11

budynku na drugi przykład z tarfile module documentation, można wyodrębnić zawartej podfolder i wszystkie jego treści z mniej więcej tak:

with tarfile.open("sample.tar") as tar: 
    subdir_and_files = [ 
     tarinfo for tarinfo in tar.getmembers() 
     if tarinfo.name.startswith("subfolder/") 
    ] 
    tar.extractall(members=subdir_and_files) 

ten tworzy listę podfolderze i jej zawartości, a następnie używa zalecanej metody extractall(), aby wyodrębnić je. Oczywiście zastąp "subfolder/" rzeczywistą ścieżką (względem katalogu głównego pliku tar) podfolderu, który chcesz wyodrębnić.

4

W drugiej odpowiedzi zostanie zachowana ścieżka podfolderu, co oznacza, że ​​subfolder/a/b zostanie wyodrębnione do ./subfolder/a/b. Aby wyodrębnić podfolder do korzeni, więc subfolder/a/b będą wyodrębniane do ./a/b można przepisać ścieżki z czymś takim:

def members(tf): 
    l = len("subfolder/") 
    for member in tf.getmembers(): 
     if member.path.startswith("subfolder/"): 
      member.path = member.path[l:] 
      yield member 

with tarfile.open("sample.tar") as tar: 
    tar.extractall(members=members(tar)) 
+0

Działa świetnie. Możesz również zmienić nazwę folderu najwyższego poziomu na ten styl, wykonując 'member.path = os.path.join ('new_dirname', member.path [l:])' – Blake