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

如何在python中指定zip文件的压缩级别?,python,zip,zipfile,Python,Zip,Zipfile,如何用python压缩文件以及如何指定压缩级别 到目前为止,我有以下代码,我得到的错误是: Zip("log4j.dl-service.log.2013-05-03-22",9) AttributeError: 'str' object has no attribute 'ZipFile' 代码: 所以我想我的评论也是答案 您的变量本质上是“重载”对导入方法的调用,这会导致代码出现一些非常糟糕的混乱。因此,请遵循以下规则: 答:不要使用与导入相同的变量名,这只是自找麻烦 B:不要使用与导入相同

如何用python压缩文件以及如何指定压缩级别

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

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


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

您的变量本质上是“重载”对导入方法的调用,这会导致代码出现一些非常糟糕的混乱。因此,请遵循以下规则:


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

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

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


如果你遵循这一点,你和你问的人就会省去很多头痛。如果选择关闭,请使用下划线分隔zip_文件、filezip或其他任何文件

这里的问题是这一行:

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的库只提供两种选择:存储或默认。如图所示:

类zipfile.zipfile(文件[,模式[,压缩[,允许zip64]])

压缩是编写归档文件时使用的压缩方法,应该存储或压缩

对于
write
/
writestr
方法也是如此

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


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

A:不要使用与导入相同的变量名,这只会带来麻烦。B:不要使用与导入相同的变量名,这样会导致无法读取。C:不要使用与导入相同的变量名。@Jefflangemier:您应该将其作为一个答案(提供更多信息),因为……嗯,这就是答案。@SimplySeth:请发布一个完整的回溯,而不仅仅是错误消息。在这种情况下,我们可以很容易地猜测,因为碰巧只有一个地方您可以尝试访问任何东西上名为
ZipFile
的属性,但为什么要让我们猜测呢?我之所以添加这个,是因为我认为@Jefflangemier不会回答。我本来打算把它删掉,但现在它已经被提升了两次。我想它提供了一些额外的解释,但Jeff发现了问题并首先给出了答案。就我个人而言,我更喜欢你的答案,我无法清晰地表达答案。@Jefflangemier:我认为“不要使用与导入相同的变量名”是非常清楚的。我喜欢这种重复,每次都有不同的原因。这是一个可悲的脑胀气病例。谢谢你。我想我应该是“苏西博士搏击俱乐部”的回答者了。
AttributeError: 'str' object has no attribute 'ZipFile'