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

Sim*_*eth 3 python zip zipfile

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

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

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

码:

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)
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 10

这里的问题是这一行:

zipfile = file+'.zip'
Run Code Online (Sandbox Code Playgroud)

之后,zipfile不再引用模块,而是引用此字符串.所以,当你这样做时:

output = zipfile.ZipFile(zipfile, 'wb')
Run Code Online (Sandbox Code Playgroud)

你问一个字符串,而不是一个模块,来打电话ZipFile.

因此这个错误:

AttributeError: 'str' object has no attribute 'ZipFile'
Run Code Online (Sandbox Code Playgroud)

修复是不调用您的变量zipfile.

正如Jeff Langemeier所说,关键是:

不要使用与刚刚要求解决的导入相同的变量名称.B:不要使用与导入相同的变量名,这样就无法读取.C:不要使用与导入相同的变量名.

更一般地说,不要对两个不同的东西使用相同的名称.


对于你的第二个问题:

如何指定压缩级别

你不能.这是故意的,原因与zip命令行工具不再记录10级压缩,仅-0用于存储(无压缩)和-9"压缩更好"相同.除了存储或默认之外,几乎没有任何好的用途.-9通常不会比默认压缩更好 - 或者它更好地压缩一些文件而其他文件更糟糕.如果你需要更好的压缩,你需要一个更好的算法,例如,使用.tar.bz2的替代.zip,或使用p7zip(可创建ZIP兼容的文件),而不是简单的zip.

因此,Python的库只为您提供两种选择:存储或默认.正如文档所示:

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

...

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

同样适用于write/ writestr方法.

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

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


Jef*_*ier 7

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

你的变量基本上是"重载"对导入方法的调用,这使得你的代码非常糟糕.请遵循以下规则:

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

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

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

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