2011-11-24 82 views
7

我有,我有一個目錄,我需要在一個給定的目錄中提取tar歸檔。 例如:我有一個目錄提取物目錄路徑中的所有文件在指定目錄下

TarPrefix/X/Y/Z

在tar歸檔我想提取其在例如一個給定的目標目錄:提取/ A /這個目錄應包含目錄TarPrefix/x/y/z中包含的所有文件和目錄。

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

獲取目錄路徑中的所有成員的名單「子文件夾/」,然後我就用tar.extractall(extracted/a,subdir_and_files) 提取,但提取所有成員與他們的目錄路徑例如,這將導致中提取/ A/X/Y/Z。 你能幫我解壓縮給定文件夾中的這些文件嗎?

+0

我不知道,但這個問題似乎是那種你相反的:HTTP: //stackoverflow.com/questions/2239655/python-tarfile-adding-files-without-directory-hiearchy也許你可以使用提取物(),而不是extractall(),看看你可以發生,有可能通過修改TarInfo你的對象得到了subdir_and_files? –

+1

不好意思問一個初學者的問題。我是python的初學者,並沒有在谷歌上找到任何答案,所以問了這樣一個問題。爲了幫助他人,我想回答這個問題。 您只需要將tarinfo.name屬性值更改爲正確的值即可。即在我給出的例子中'tarinfo.name = tarinfo.name [len(Tarprefix/x/y/z):]'然後使用相同的代碼工作。 – gaurav

+0

我試圖回答我自己的問題,但直到八小時才被允許,所以一直在等待。 – gaurav

回答

12

看起來你可能已經找到了答案,但這裏是我的版本,反正:

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

感謝您的幫助。雅我通過試驗東西找到答案:)。無論如何非常感謝。 – 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

描述了你的答案。 – Satendra

相關問題