如何在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)发布于 2013-05-08 03:38:45
这里的问题是这一行:
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。除了store或default之外,几乎没有任何好的用途。-9通常不会比默认的更好地压缩--或者它对一些文件的压缩更好,而对其他文件的压缩更差。如果你需要更好的压缩,你需要一个更好的算法--例如,使用.tar.bz2代替.zip,或者使用p7zip (它可以创建压缩兼容的文件)而不是普通的zip。
因此,Python的库只为您提供两个选择: store或default。正如the docs所展示的:
class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])
…
压缩是写入归档文件时使用的ZIP压缩方法,应为ZIP_STORED或ZIP_DEFLATED
对于write/writestr方法也是如此。
如果您真的想这样做,您可以直接调用zlib.compress,直接创建一个ZipInfo对象,然后自己将其添加到归档中。如果您查看the source (从文档中链接),就会发现writestr是做什么的--只要去掉所有不相关的条件和类型检查,它就不复杂了。
但说真的,我不认为你想这么做。
发布于 2013-05-08 03:36:40
所以我想我的评论也是答案。
你的变量本质上是“重载”了对导入方法的调用,使得你的代码变得非常糟糕。因此,请遵循以下规则:
答:不要使用与您的导入相同的变量名,这只会自找麻烦。
B:不要使用与您的导入相同的变量名称,这会使您无法读取。
C:不要使用与您的导入相同的变量名。
如果你遵循这一点,你和你问的人都会省去很多麻烦。如果这样做,请选择关闭它,使用下划线分隔zip_file、filezip或其他任何文件。
https://stackoverflow.com/questions/16427060
复制相似问题