2011-05-19 107 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文件时尝试。

相关问题