2011-11-04 115 views
6

我在一個項目中的蟒蛇,我需要只提取tar歸檔並不是所有的文件的子文件夾中工作的單一目錄。 我試圖用只提取焦油

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

但是,這並不工作,但不提取給定的子目錄也不會拋出異常。我是一名Python初學者。 此外,如果上述功能不適用於目錄工作什麼()這個命令和tar.extractfile之間的區別?

+0

extractfile()不將文件寫入磁盤,它只是給你一個python對象。 extract()寫入磁盤。 –

回答

11

大廈從tarfile module documentation第二個例子,你可以提取所包含的子文件夾和它的所有內容像這樣的東西:

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) 

這將創建子文件夾及其內容的列表,並然後使用推薦的extractall()方法來提取它們。當然,將"subfolder/"替換爲要提取的子文件夾的實際路徑(相對於tar文件的根目錄)。

4

對方回答將保留的子文件夾路徑,這意味着subfolder/a/b將提取到./subfolder/a/b。要提取一個子文件夾的根,所以subfolder/a/b將被抽取到./a/b,你可以像這樣重寫路徑:

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

工程很棒。你也可以通過執行'member.path = os.path.join('new_dirname',member.path [l:]')來重命名這個樣式的頂層文件夾。 – Blake