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

Posted

技术标签:

【中文标题】如何在 python 中指定 zip 文件的压缩级别?【英文标题】:How do I specify the compression level of a zip file in python? 【发布时间】:2013-05-07 19:31:26 【问题描述】:

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

【问题讨论】:

答:不要使用与你的导入相同的变量名,这只是自找麻烦。 B:不要使用与您的导入相同的变量名称,这会导致无法读取。 C:不要使用与导入相同的变量名。 @JeffLangemeier:你应该把它写成答案(包含更多信息),因为……嗯,这就是答案。 @SimplySeth:请发布整个回溯,而不仅仅是错误消息。在这种情况下,我们可以很容易地猜测,因为碰巧只有一个地方您尝试访问任何东西上名为 ZipFile 的属性,但为什么让我们猜测呢? 【参考方案1】:

这里的问题是这一行:

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 兼容的文件)而不是普通的zip

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

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

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

write/writestr 方法也是如此。

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

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

【讨论】:

我只添加了这个,因为我认为@JeffLangemeier 不会回答。我打算删除它,但现在它已被投票两次。我想它提供了一些额外的解释,但 Jeff 发现了问题并首先提供了答案。 就个人而言,我更喜欢你的答案,我无法清楚地表达出答案。 @JeffLangemeier:我认为“不要使用与您的导入相同的变量名称”非常清楚。而且我喜欢重复,每次都有不同的原因。 这是我代表的一个可悲的脑胀气案例。谢谢。 我想我会成为“苏珊博士搏击俱乐部”的回答者。【参考方案2】:

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

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

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

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

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

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

【讨论】:

以上是关于如何在 python 中指定 zip 文件的压缩级别?的主要内容,如果未能解决你的问题,请参考以下文章

批处理如何压缩文件成rar 并且解压rar中指定文件

zip

解压特定zip压缩文件中特定文件,Java

python如何读取txt文件中指定内容?

如何在 Flutter MultiImagePicker 中指定照片的质量?

Linux怎么查看文本中指定行的内容