3

如何在 python 中压缩文件以及如何指定压缩级别?

到目前为止,我有以下代码,我得到的错误是:

Zip("log4j.dl-service.log.2013-05-03-22",9)
AttributeError: 'str' object has no attribute 'ZipFile'

代码:

import zipfile
import fileinput

def Zip(file,level):
    """
    This function uses the zip library native to python to compress files with
    Usage: Zip(file,level)
    """

    if file and level:
        try:
            zipfile = file+'.zip'
            output = zipfile.ZipFile(zipfile, 'wb')
            for line in fileinput.input(file):
                output.write(line)
            output.close()
            if os.path.exists(zipfile):
                return zipfile
            else:
                logMe('critical',"zip failed in Zip()")
                return False

        except Exception,e:
            logMe('critical',e)
4

2 回答 2

10

这里的问题是这一行:

zipfile = file+'.zip'

之后,zipfile不再指模块,而是指这个字符串。所以,当你这样做时:

output = zipfile.ZipFile(zipfile, 'wb')

您要求的是一个字符串,而不是一个模块来调用ZipFile.

因此这个错误:

AttributeError: 'str' object has no attribute 'ZipFile'

解决方法是不要调用您的变量zipfile

正如 Jeff Langemeier 所说,关键是:

不要使用与您的导入相同的变量名称,这只是自找麻烦。B:不要使用与您的导入相同的变量名称,这会导致无法读取。C:不要使用与你的导入相同的变量名。

更一般地说,不要为两个不同的事物使用相同的名称。


对于你的第二个问题:

如何指定压缩级别

你不能。这是故意的,出于同样的原因,zip命令行工具不再记录 10 级压缩,仅-0用于存储(不压缩)和-9“更好地压缩”。除了存储或默认值之外,几乎没有任何用处。-9通常不会比默认压缩更好 - 或者它压缩一些文件更好而另一些文件更差。如果您需要更好的压缩,则需要更好的算法——例如,使用.tar.bz2代替.zip,或使用p7zip(可以创建与 zip 兼容的文件)代替 plain zip

所以,Python 的库只给你两个选择:存储或默认。正如文档所示:

class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])

…</p>

压缩是写入存档时使用的 ZIP 压缩方法,应该是 ZIP_STORED 或 ZIP_DEFLATED

对于write/writestr方法也是如此。

如果你真的想这样做,你可以直接调用zlib.compress,直接创建一个ZipInfo对象,然后自己添加到归档中。如果您查看源代码(从文档链接),您可以看到它做了什么writestr——一旦您去掉所有不相关的条件和类型检查,它真的并不复杂。

但实际上,我认为你不想这样做。

于 2013-05-07T19:38:45.170 回答
7

所以我想我的评论也是答案。

您的变量本质上是“重载”对导入方法的调用,从而对代码进行了一些非常糟糕的修改。所以请遵循以下规则:

答:不要使用与您的导入相同的变量名称,这只是自找麻烦。

B:不要使用与您的导入相同的变量名称,这会导致无法读取。

C:不要使用与你的导入相同的变量名。

如果你遵循这个,它会拯救你和你问很多头痛的人。如果您选择关闭它,请使用下划线分隔 zip_file、filezip 或其他任何内容。

于 2013-05-07T19:36:39.800 回答