如何在python中指定zip文件的压缩级别?

时间:2013-05-07 19:31:26

标签: python zip zipfile

如何在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)

2 个答案:

答案 0 :(得分: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&#34相同;压缩更好"。除了商店或默认设置之外,几乎从来没有任何好的用途。 -9通常不会比默认压缩效果更好 - 或者它会更好地压缩某些文件而其他文件会更糟糕。如果您需要更好的压缩,则需要更好的算法 - 例如,使用.tar.bz2而不是.zip,或使用p7zip(可以创建与zip兼容的文件)而不是普通{{1 }}

因此,Python的库只提供两种选择:存储或默认。正如the docs所示:

  

zip

     

...

     

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

同样适用于class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]]) / write方法。

如果您真的想这样做,可以直接致电writestr,直接创建zlib.compress对象,然后自行将其添加到存档中。如果您查看the source(从文档链接),您可以看到ZipInfo执行的操作 - 一旦您删除所有不相关的条件并键入支票,它就不会很复杂。< / p>

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

答案 1 :(得分:7)

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

您的变量基本上是“重载”对导入方法的调用,使得代码的某些内容非常糟糕。请遵循以下规则:

答:不要使用与您的导入相同的变量名称。

B:不要使用与导入相同的变量名,这样就无法读取。

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

如果你遵循这个原则,它会拯救你和那些让你头疼的人。如果您这样做,请选择将其关闭,使用下划线分隔zip_file或filezip或其他任何内容。