2016-09-01 20 views
2

我試圖使用tarfile庫來存檔和壓縮沿多個驅動器分佈的多個目錄。 問題是,即使兩個文件存儲在不同的驅動器中,tarfile也會合並路徑。 例如:在tarfile中區分不同驅動器中的文件

import tarfile 
with tarfile.open(r"D:\Temp\archive.tar.gz", "w:gz") as tf: 
    tf.add(r"C:\files\foo") 
    tf.add(r"D:\files\bar") 

將創建一個包含下列文件的存檔:

archive.tar.gz 
└─ files 
    ├─ foo 
    └─ bar 

是否有創建此的一種方式?

archive.tar.gz 
├─ C 
| └─ files 
|  └─ foo 
└─ D 
    └─ files 
     └─ bar 

回答

0

感謝盧瓦克你的答案,它幫助我找到答案實際我一直在尋找。 (而且也讓我浪費大約小時,因爲我與你在你的答案混合了Linux和Windows風格的路徑真的很困惑)...

import os 
import tarfile 

def create_archive(paths, arc_paths, archive_path): 
    with tarfile.open(archive_path, "w:gz") as tf: 
     for path, arc_path in zip(paths, arc_paths): 
      tf.add(path, arcname=arc_path) 

def main(): 
    archive = r"D:\Temp\archive.tar.gz" 
    paths = [r"C:\files\foo", r"D:\files\bar"] 
    # Making sure all the paths are absolute. 
    paths = [os.path.abspath(path) for path in paths] 
    # Creating arc-style paths 
    arc_paths = [path.replace(':', '') for path in paths] 
    # Create the archive including drive letters (if in windows) 
    create_archive(paths, arc_paths, archive) 
4

你需要使用tarfile.addfile()而不是tarfile.add()

隨着TarInfo您可以指定將在歸檔中使用的文件名。

例:

with open(r"C:\files\foo", "rb") as ff: 
    ti = tf.gettarinfo(arcname="C/files/foo", fileobj=ff) 
    tf.addfile(ti, ff) 

或許,更快的解決方案:

tf.add('/path/to/dir/to/add/', arcname='C/files') 
tf.add('/path/to/otherdir/to/add/', arcname='D/files') 
+1

我已經改變了您的示例代碼,因爲你所寫的用途'file'而不是'open'(這已被棄用,並在Python 3中),並且直接使用名稱創建TarInfo並不會填充所有其他文件統計信息,最重要的是大小(沒有大小則不會把所有的數據都歸檔) – Random832

+0

好的,謝謝@ Random832 順便說一下: 'tar.add('/ path/to/dir/to/add /',arcname ='C/files')'? –

+0

嘿,我沒有注意到那裏,因爲你在答案中提到了它,所以我專注於addfile。 – Random832

相關問題