【问题标题】:Creating a zip file with compression in python using the zipfile module使用 zipfile 模块在 python 中创建带有压缩的 zip 文件
【发布时间】:2014-08-22 14:05:41
【问题描述】:

我是 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"

它也没有被压缩。

【问题讨论】:

  • 您的代码不会创建“包含整个继承的目录结构”的 zip 文件。它有一个路径为Python\Dir_dir\Dir_dir 的文件,这是正确的(请参阅screenshot),因为存档文件名应与存档根目录相关,因此不应以路径分隔符(或驱动器号)开头。这是在documentation 中,所以我建议您通过查看它来增加您对stackOverFlow 代码的阅读。
  • 顺便说一句,在 Windows 路径名中使用原始字符串或双转义反斜杠(在前面添加一个 r,如 r"D:\Python\Dir_dir\Dir_dir2\ABC_TEST.zip")。否则,Python 会将 '\t' 和 '\n' 之类的序列转换为制表符和换行符。
  • 或者只使用正斜杠,简单易做,易读。

标签: python zip compression


【解决方案1】:

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

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

我认为您要求删除 zip 文件中文件的相对路径。如果你真的想要这样,你可以写:

zip.write(locfile, os.path.basename(locfile))

但这可能是个坏主意,因为如果您压缩两个同名文件,删除所有路径信息会导致命名冲突。

【讨论】:

  • 完全删除添加到存档中的文件的目录结构不是 OP 想要的。您可能还会提到您如何安排要压缩的数据。
  • @martineau - 按照您的建议解释压缩
  • os.path.basename(locfile) 将存档中的文件名设置为 'ABC.txt' 并去除所有路径信息。这对于源目录中的第一级文件可能没问题,但是任何子文件夹中都有一些文件,这可能是一个问题。
  • 我们以不同的方式解释“我想要:“D:\Python\Dir_dir\Dir_dir2\ABC_TEST.zip\ABC.txt”。你看过screenshot我用什么制作的吗?
  • @martineau - 我已经改写了我的答案,以使我对问题的解释更清楚,并确保 OP 理解为什么它可能是一个问题。
【解决方案2】:

查看official documentation,它清楚地解决了您的问题。

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

compress 应该是定义的常量之一,例如 ZIP_DEFLATED

注意你也可以在构造函数中指定压缩类型 将应用于添加到 zip 存档中的所有文件。

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

此外,如果您只是在任何搜索引擎中输入 python zipfile,您就会看到官方文档作为第一个链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    相关资源
    最近更新 更多