Python zipfile 模块不压缩文件

Posted

技术标签:

【中文标题】Python zipfile 模块不压缩文件【英文标题】:Python zipfile module doesn't compress files 【发布时间】:2013-08-09 16:54:40 【问题描述】:

我在 Python 中遇到了压缩问题。 我知道我应该在写入压缩 zip 文件时调用 ZIP_DEFLATED 方法,但它对我不起作用。 我在 C:zip 目录中有 3 个 PDF 文档。 当我运行以下代码时,它工作得很好:

import os,sys
list = os.listdir('C:\zip')
file = ZipFile('test.zip','w')
for item in list:
    file.write(item)
file.close()

它使 test.zip 文件没有压缩。 当我将第四行更改为:

file = ZipFile('test.zip','w', compression = ZIP_DEFLATED)

它还可以使 test.zip 文件不经过压缩。 我还尝试更改写入方法以赋予它 compress_ type 参数:

file.write(item, compress_type = ZIP_DEFLATED)

但这也不起作用。 我在 Win7 中使用 Python 2.7.4 版。 我用另一台计算机(相同的情况,Win7 和 Python 2.7.4)厌倦了代码,它使 test.zip 文件按应有的方式压缩。 我知道 zlib 模块应该可用,当我运行它时:

import zlib

它不会返回错误,如果 zlib 模块有问题,顶部的代码也应该返回错误,所以我怀疑 zlib 不是问题。

【问题讨论】:

您如何检查最终的 zip 文件是否已压缩或未压缩? Zipfile 构造函数的文档说“如果指定了 ZIP_DEFLATED 但 zlib 模块不可用,则还会引发 RuntimeError。”因此,如果您没有收到错误,它应该可以工作。请注意,没有必要在 write() 调用上指定 compress_type 关键字参数,除非您想覆盖为构造函数提供的 compression 参数值。 【参考方案1】:

默认情况下ZIP模块只存储数据,压缩它你可以这样做:

import zipfile
try:
    import zlib
    mode= zipfile.ZIP_DEFLATED
except:
    mode= zipfile.ZIP_STORED

zip= zipfile.ZipFile('zipfilename', 'w', mode)
zip.write(item)
zip.close()

【讨论】:

不幸的是,这也不起作用。 mode 变量返回一个“8”,因此它成功地将 mode 设置为 ZIP_DEFLATED,但 zipfile 仍然太大。 “还是太大了”,但压缩效果不佳或根本未压缩? 对不起,它现在似乎可以工作,看起来我在尝试使用其他文件时在代码中犯了一个错误。之后我只处理了 3 个 PDF 文档,压缩文件的大小几乎与 3 个 PDF 文档的大小一样大,我认为压缩仍然不起作用。感谢您的帮助! 好的,不客气!如果您认为这是对您问题的有效答案,那么如果您将其标记为已接受,那就太好了! ZIP_STORED 是如何默认的?!?! D:哇!感谢您清除此问题! 7zip 制作的拉链要小得多 ?

以上是关于Python zipfile 模块不压缩文件的主要内容,如果未能解决你的问题,请参考以下文章

python常用标准库(压缩包模块zipfile和tarfile)

Python实现批量压缩文件/文件夹——zipfile

使用 ZipFile 模块从 zipfile 中删除文件

Python 文件解压缩

Python实现批量压缩文件/文件夹——zipfile

Python 压缩文件处理 zipfile & tarfile