2015-08-28 58 views
0

我有一個用下面的代碼拉鍊目錄的腳本:郵編目錄,以便它返回upacked當acutal目錄

def zipdir(path, ziph): 
    # ziph is zipfile handle 
    for root, dirs, files in os.walk(path): 
     for file in files: 
      ziph.write(os.path.join(root, file),arcname=file) 
zip = zipfile.ZipFile('/path/to/directory.zip','w') 
zipdir('/path/to/directory/',zip) 

當我解壓這個我結束了與目錄的內容,而不是到包含文件的原始目錄。我應該如何改變這個,以便解壓縮返回原始目錄中的文件仍然在裏面? 。

即)解壓 - > /解壓縮/位置/目錄/ file_from_directory

,而不是

解壓 - > /解壓縮/位置/ file_from_directory

回答

1

您使用file作爲arcname,但要在路徑的文件加上最深的目錄:

 for file in files: 
      deepest_dir = os.path.split(root)[-1] 
      fname = os.path.join(deepest_dir, file) 
      ziph.write(os.path.join(root, file), arcname=fname) 
+0

與消除arcname說法的問題在於,它包括高DIRECTO也是如此。我正在編寫的腳本將tar文件轉換爲zip文件,並且用作輸入的tar文件位於/transform/gwarner/test/file.tgz目錄中。如果我在沒有arcname語句的情況下運行它,則.zip文件將包含根目錄下最高級別目錄的所有內容。我只想包含最低的目錄。 –

+0

你的意思是/test/file.tgz?在這種情況下,只需將路徑字符串拆分爲'/'(如果要保留泛型,則使用'os.path.sep'),保留最後兩個元素(最深的目錄和文件名)並用'/'連接。 –

+0

對不起,我有點困惑。你是否在討論os.walk(path)中的'root,dirs,files?'行? –