无法解压缩用zipfile构建的存档(Python)

时间:2011-05-19 19:31:58

标签: python zip archive zipfile

我在使用Python中的zipfile构建的存档时遇到问题。我正在遍历目录中的所有文件并将它们写入存档。当我尝试在之后提取它们时,我得到一个与路径分隔符相关的异常。

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 \ index”和标题   “env / index”不同。

更新:我用一个临时文件(cStringIO.StringIO())替换了字符串缓冲区tempfile.mkstemp("temp.zip"),现在它可以工作了。当zipfile模块写入破坏存档的缓冲区时会发生一些事情,但不确定问题是什么。

问题是我正在读取/写入以“r”/​​“w”模式而不是“rb”/“wb”打开的文件中的信息。这在Linux中不是问题,但由于字符编码,它在Windows中给了我错误。解决。

4 个答案:

答案 0 :(得分:5)

您应该考虑在字符串前添加 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在最后一行被解释为标签 formfeed

有趣的是,您也可以将反斜杠更改为正斜杠(即open("C:/path/to/folder"),这样可以正常工作。

或者,用反斜杠(即open("C:\\path\\to\\folder"))来逃避反斜杠。

IMO,最清晰,最简单的解决方案是简单地添加 r


编辑: 看起来你需要使用第二种解决方案,正斜杠。 zipfile库显然有点严格 - 鉴于这是一个只有窗口的bug,它可能会偷偷摸摸。 (见Issue 6839)。

答案 1 :(得分:3)

在此处找到我的问题的答案:http://www.penzilla.net/tutorials/python/scripting

我正在粘贴与压缩目录相关的两个函数。问题不是字符串缓冲区,也不是斜杠,而是我迭代和写入zipfile的方式。这两个递归函数解决了这个问题。使用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!"

答案 2 :(得分:1)

你需要逃避路径中的反斜杠。

尝试更改以下内容:

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

答案 3 :(得分:1)

即使在Windows上,也可以使用正斜杠作为路径分隔符。我建议您在创建zip文件时尝试。