2017-01-03 95 views
2

我試圖使用python zipfile模塊壓縮文件夾中的所有文件(該文件夾沒有任何子目錄),但似乎無法獲得所需的輸出。我有folderA坐在F:\Projects\ProjectA\Folders\folderA and my script under F:\Projects\ProjectA\CodeA\zipcode.py。我想壓縮folderA中的所有文件,以便生成的壓縮文件在F:\Projects\ProjectA\Folders下命名爲folderA.zip,並使用原始文件名。Python - 使用zipfile模塊壓縮目錄中的所有文件

唯一的問題是,解壓縮結果會生成Folders \ folderA而不是隻有folderA。它與folderA的相對路徑有關,但我似乎無法獲得所需的結果。

#zipcode.py 
import os 
import zipfile 

filepath = "F:/Projects/ProjectA/Folders/folderA" 

archive = zipfile.ZipFile(os.path.abspath(filepath) + '.zip', 'w') 

for root, dirs, files in os.walk(filepath): 
     for afile in files: 
      archive.write(os.path.relpath(os.path.join(root, afile))) 
     archive.close() 

回答

0

在循環,改變使用arcname參數檔案成員的名字:

archive.write(os.path.join(root, afile),arcname=name_in_archive) 

name_in_archive = os.path.join(os.path.basename(filepath),afile) 

保存folderA路徑。

我不確定的一件事(取決於python的版本)是,你可能必須用斜槓替換windows反斜槓,所以.zip文件是可移植的。不傷害:

archive.write(os.path.join(root, afile),arcname=name_in_archive.replace(os.sep,"/")) 

請注意,我已經放棄了os.path.relpath呼叫,沒有必要,因爲現在我們已經在存檔文件名的完全控制。

另請注意,打開存檔時轉換爲絕對路徑不是必需的。 open找到該文件,如果它是相對的,以及它是否是絕對的:

archive = zipfile.ZipFile(os.path.abspath(filepath) + '.zip', 'w') 

可能只是寫

archive = zipfile.ZipFile(filepath + '.zip', 'w') 
+0

其實我是想輸出的zip文件包含一個名爲folderA的所有文件駐留文件夾在裏面。以上將直接將文件寫入壓縮文件。 –

+0

@Riz_K:對我的第一個答案爲true,但是我的編輯添加了'name_in_archive = os.path.join(os.path.basename(filepath),afile)'。這爲所有文件添加了'folderA'前綴。重要的一點是你知道如何控制檔案中文件的名稱。 –

+0

真棒...感謝細節! –

相關問題