2011-05-19 104 views
3

我在使用Python中的zipfile構建的壓縮文件時遇到問題。我遍歷目錄中的所有文件並將它們寫入存檔。當我試圖提取它們後,我得到一個與路徑分隔符相關的異常。無法解壓使用zipfile構建的壓縮文件(Python)

the_path= "C:\\path\\to\\folder" 
zipped= cStringIO.StringIO() 
zf = zipfile.ZipFile(zipped_cache, "w", zipfile.ZIP_DEFLATED) 
for dirname, subdirs, files in os.walk(the_path) : 
    for filename in files: 
     zf.write(os.path.join(dirname, filename), os.path.join(dirname[1+len(the_path):], filename)) 
zf.extractall("C:\\destination\\path") 
zf.close() 
zipped_cache.close() 

這裏的例外:

zipfile.BadZipfile:在 目錄 「ENV \指數」 和頭 「ENV /索引」 文件名不同。

更新:我更換了字符串緩衝區cStringIO.StringIO()有一個臨時文件(tempfile.mkstemp("temp.zip")),現在它的工作原理。當zipfile模塊寫入緩衝區破壞歸檔文件時會發生這種情況,但不確定問題是什麼。

問題是我正在從/中讀取/寫入以「r」/​​「w」模式而不是「rb」/「wb」打開的文件中的信息。這在Linux中不是問題,但由於字符編碼的原因,它在Windows中出現錯誤。解決了。

+4

發佈例外,傻! – dkamins 2011-05-19 19:33:39

+0

我只給出了這些例子,路徑正確地形成,並帶有反斜槓('C:\\ path \\到\\ folder')。但答覆都沒有回答這個問題。例外是「zipfile.BadZipfile:目錄中的文件名」env \ index「和標題」env/index「不同。」 – Cat 2011-05-19 19:46:00

+2

+1支持反對隨機,無法解釋的downvotes。 – jedwards 2011-05-19 19:47:48

回答

2

在這裏找到了我的問題的答案:http://www.penzilla.net/tutorials/python/scripting

我粘貼了與壓縮目錄相關的兩個函數。問題不是字符串緩衝區,也不是斜線,而是我迭代並寫入zipfile的方式。這2個遞歸函數解決了這個問題。使用os.walk遍歷整個子目錄樹不是編寫存檔的好方法。

def zippy(path, archive): 
    paths = os.listdir(path) 
    for p in paths: 
     p = os.path.join(path, p) # Make the path relative 
     if os.path.isdir(p): # Recursive case 
      zippy(p, archive) 
     else: 
      archive.write(p) # Write the file to the zipfile 
    return 

def zipit(path, archname): 
    # Create a ZipFile Object primed to write 
    archive = ZipFile(archname, "w", ZIP_DEFLATED) # "a" to append, "r" to read 
    # Recurse or not, depending on what path is 
    if os.path.isdir(path): 
     zippy(path, archive) 
    else: 
     archive.write(path) 
    archive.close() 
    return "Compression of \""+path+"\" was successful!" 
+0

請將此標記爲解決方案 – 2013-10-15 17:07:50

4

您應該考慮在字符串之前添加一個r以指示它是原始字符串 - 路徑中的反斜槓將被解釋爲轉義字符。

以下代碼:

#!/bin/env python  
print(r"C:\destination\path") 
print(r"C:\path\to\folder") 
print("C:\destination\path") 
print("C:\path\to\folder") 

產生以下輸出:

C:\destination\path 
C:\path\to\folder 
C:\destination\path 
C:\path o 
     older 

注意,\ t與\ f分別解釋爲標籤在最後一行換頁

有趣的是,你也可以將反斜槓改爲正斜槓(即open("C:/path/to/folder"),這將起作用。或者,用...反斜槓(即open("C:\\path\\to\\folder"))逃避反斜槓。

IMO,最清晰和最簡單的解決方案是簡單地添加一個r


編輯: 看起來你需要去的第二個解決方案,正斜槓。 zipfile庫顯然是嚴格的 - 並且考慮到這是一個純粹的窗口缺陷,它可能會偷偷摸摸地通過。 (見Issue 6839)。

1

您需要跳過路徑中的反斜槓。

嘗試改變如下:

  • the_path= "C:\path\to\folder"the_path = "C:\\path\\to\\folder",和
  • zf.extractall("C:\destination\path")zf.extractall("C:\\destination\\path")
1

即使在Windows上,也可以使用正斜槓作爲路徑分隔符。我建議在創建zip文件時嘗試。

相關問題