2011-05-27 64 views

回答

1

使用TarFile.extractfile()並將其寫入您選擇的文件。

+0

這是一個解決方案,但我寧願重命名文件,而不是複製每一行。 – Parikshit 2011-05-27 08:32:42

+0

你不禁要「複製每一行」,因爲這是如何提取的。 'shutil.copyfileobj'是一個方便的工具來完成自己的拷貝。 – 2011-05-27 09:23:28

0

您可以使用功能extractall來滿足您的需求。根據the documentation將存檔中的所有成員提取到當前工作目錄或目錄路徑。

TarFile.extractall(path="my/path") 
+0

'tarfile'不是由我創建的。有沒有辦法可以在tarfile創建後更改arcname? – Parikshit 2011-05-27 08:12:41

+0

是的,對不起,這是我更仔細閱讀後才知道的!請參閱我的編輯,它應該更適合您的需求。 – Emmanuel 2011-05-27 08:25:36

+0

它仍然以遞歸方式創建文件夾,如'my/path // home/usr/path/to/file'中所示。 – Parikshit 2011-05-27 08:31:16

0

您可以通過黑客TarInfo對象從Tarfile.getmembers()得到改變arcnames。然後,您可以使用Tarfile.extractall以新名稱將成員編寫到您選擇的目的地。

例如,下面的函數將歸檔的任意部分樹中選擇成員,並在他們的基地名稱提取到一個目的地:

def extractTo(tar, dest, selector): 
    if type(selector) is str: 
     prefix = selector 
     selector = lambda m: m.name.startswith(prefix) 
    members = [m for m in tar.getmembers() if selector(m)] 
    for m in members: 
     m.name = os.path.basename(m.name) 
    tar.extractall(path = dest, members = members) 

假設tar爲代表的一些成員的存檔TarFile實例一個utilities/misc目錄,並且您想將這些成員摺疊到local/bin目錄中。您可以這樣做:

extractTo(tar, 'local/bin', 'utilities/misc/') 

請注意尾部/上的目錄前綴。我們不想將misc目錄添加到「local/bin」,而只是將其成員。

相關問題