如何在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)
答案 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或其他任何内容。