2013-04-25 30 views
1

我正在使用下面的代碼壓縮每天創建的備份文件。如何只添加一個文件到zip,而不是Python中的文件夾路徑?

import os, zipfile 

zf = zipfile.ZipFile("Test.zip", "w") 
for root, subdirs, files in os.walk("C:/Users/Bob/Desktop/Zip"): 
    for filename in files: 
     zf.write(os.path.join(root, filename)) 
zf.close() 

問題是,當我打開zip文件時,它包括通向文件的路徑中的所有文件夾。例如,在zip文件夾中,我將有一個名爲Users/Bob/Desktop/Zip/File.gdb的文件夾。但我只想要zip中的File.gdb。原因是因爲當它包含所有這些文件夾時,它實際上並沒有壓縮文件。當它不在拉鍊內時,它的尺寸相同。但是,如果我只壓縮File.gdb,它從30Mb到3Mb。

任何幫助表示讚賞。

+0

你要問哪個一下,文件名或壓縮?他們完全不相關。 – 2013-04-25 14:52:40

回答

2

你需要看看arcname parameter of ZipFile.write

ZipFile.write(filename[, arcname[, compress_type]])

編寫一個名爲filename到存檔文件,給它存檔名稱arcname(默認情況下,這將是一樣的filename ,但沒有驅動器號並且刪除了前導路徑分隔符)。

在你的情況,你最有可能想:

zf.write(os.path.join(root, filename), filename, zipfile.ZIP_DEFLATED) 
+0

謝謝!這確實奏效,但由於某種原因,它仍然不會像我在文件夾中右鍵單擊該文件夾並通過Windows發送壓縮文件那樣壓縮文件。任何想法,爲什麼我沒有得到任何壓縮? – ianbroad 2013-04-25 14:47:25

+1

路徑名與壓縮無關。你沒有得到壓縮,因爲你沒有要求它。嘗試:''zf.write(os.path.join(root,filename),compress_type = ZipFile.ZIP_DEFLATED)'或'zf.write(os.path.join(root,filename),filename,ZipFile.ZIP_DEFFLATED)'。 – 2013-04-25 14:50:35

+0

謝謝。除了Zipfile.ZIP_DEFLATED應該有一個小寫的Z,這樣也可以工作,所以zipfile.ZIP_DEFLATED。 – ianbroad 2013-04-25 14:57:54

相關問題