【发布时间】:2011-08-29 03:59:09
【问题描述】:
我在使用 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”和标题 “环境/索引”不同。
更新:我用一个临时文件 (tempfile.mkstemp("temp.zip")) 替换了字符串缓冲区 cStringIO.StringIO(),现在它可以工作了。当 zipfile 模块写入损坏存档的缓冲区时会发生一些事情,但不确定是什么问题。
问题是我正在从/写入以“r”/“w”模式而不是“rb”/“wb”模式打开的文件中的信息。这在 Linux 中不是问题,但由于字符编码,它在 Windows 中给了我错误。解决了。
【问题讨论】:
-
我仅将这些作为示例,路径格式正确,带有转义的反斜杠('C:\\path\\to\\folder')。但是,没有一个答复回答了这个问题。例外是“zipfile.BadZipfile:目录“env\index”和标题“env/index”中的文件名不同。”
-
+1 支持反对随机的、无法解释的反对票。
-
我更新了我的答案——这应该可以解决你的问题。
-
如果你使用
zf.write(os.path.join(dirname, filename))会发生什么? -
好吧,如果我不给
write函数提供第二个参数,它只会在存档中构建整个目录结构,而我不需要。例如。useless\\directory\\structure\\up\\to\\relevant\\directory而不是relevant\\directory。我认为这个问题与cStringIO.StringIO()有关
标签: python zip archive zipfile