我在使用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中给了我错误。解决。德尔>
答案 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文件时尝试。