如何在 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 文件的压缩级别?的主要内容,如果未能解决你的问题,请参考以下文章