使用zipfile模块在Python中创建带有压缩的zip文件

5

我是Python的新手。我的需求是将源目录中的所有文件(带压缩)压缩到目标目录中。我已经使用了来自StackOverFlow的以下代码。

import zipfile, os
locfile = "D:\Python\Dir_dir\Dir_dir\ABC.txt"
loczip = "D:\Python\Dir_dir\Dir_dir2\ABC_TEST.zip"
zip = zipfile.ZipFile (loczip, "w")
zip.write (locfile)
zip.close()

它正在创建一个zip文件,但该文件包含了整个继承的目录结构。除了驱动器(D:/)之外,其余结构都被添加到zip中。它看起来像这样: "D:\Python\Dir_dir\Dir_dir2\ABC_TEST.zip\Python\Dir_dir\Dir_dir\ABC.txt"
然而我想要的是: "D:\Python\Dir_dir\Dir_dir2\ABC_TEST.zip\ABC.txt"
此外,它没有压缩。

1
你的代码没有创建一个“包含整个继承目录结构”的zip文件。它只有一个文件,路径为Python\Dir_dir\Dir_dir,这是正确的(请参见截图),因为归档文件名应该相对于归档根目录,所以不应该以路径分隔符(或驱动器号)开头。这在文档中有说明,因此我建议您在查看StackOverFlow代码时增加阅读文档的内容。 - martineau
2
顺便提一下,在 Windows 路径名中使用原始字符串或双重转义反斜杠(在前面添加 r,如 r"D:\Python\Dir_dir\Dir_dir2\ABC_TEST.zip")。否则,Python 将把像 '\t' 和 '\n' 这样的序列转换为制表符和换行符。 - tdelaney
或者只需使用正斜杠,易于实现,易于阅读。 - Gary Walker
2个回答

11

为启用压缩,请在构造函数中指定压缩方法:

zip = zipfile.ZipFile(loczip, "w", zipfile.ZIP_DEFLATED)

我认为您是想要移除压缩文件内的相对路径。如果您真的想要这样做,您可以编写以下内容:


我认为您正在要求删除zip文件中文件的相对路径。如果您确实希望这样做,您可以编写以下内容:
zip.write(locfile, os.path.basename(locfile))

然而这可能是个不好的想法,因为如果你压缩两个同名的文件并移除全部路径信息,将导致命名冲突。


完全删除添加到归档文件的目录结构不是OP想要的。您还可以提及如何安排数据进行压缩。 - martineau
1
@martineau - 按照您的建议解释了压缩。 - snowcrash09
os.path.basename(locfile) 将存档文件中的文件名设置为 'ABC.txt',并剥离所有路径信息。这对于源目录中的第一级文件可能没问题,但如果有任何子文件夹中的文件,那么这可能会成为一个问题。 - martineau
我们对“我想要:D:\Python\Dir_dir\Dir_dir2\ABC_TEST.zip\ABC.txt”这个路径的解释不同。你看了我制作的截图吗? - martineau
@martineau - 我已经重新措辞了我的答案,以使我对问题的解释更清晰,并确保原帖作者明白为什么这可能是个问题。 - snowcrash09

2

请查看官方文档,它能够清晰地解决你的问题。

ZipFile.write(filename, arcname=None, compress_type=None)

压缩应该是已定义的常量之一,例如ZIP_DEFLATED。

请注意,您也可以在构造函数上指定压缩类型,并将其应用于添加到zip归档文件中的所有文件。

文档还包括以下说明:存档名称应相对于存档根目录,即它们不应以路径分隔符开头。

此外,如果您只需在任何搜索引擎中输入 python zipfile ,则会看到官方文档作为最初的链接之一。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接