Sim*_*eth 3 python zip zipfile
如何在python中压缩文件以及如何指定压缩级别?
到目前为止,我有以下代码,我得到的错误是:
Zip("log4j.dl-service.log.2013-05-03-22",9)
AttributeError: 'str' object has no attribute 'ZipFile'
Run Code Online (Sandbox Code Playgroud)
码:
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)
Run Code Online (Sandbox Code Playgroud)
aba*_*ert 10
这里的问题是这一行:
zipfile = file+'.zip'
Run Code Online (Sandbox Code Playgroud)
之后,zipfile不再引用模块,而是引用此字符串.所以,当你这样做时:
output = zipfile.ZipFile(zipfile, 'wb')
Run Code Online (Sandbox Code Playgroud)
你问一个字符串,而不是一个模块,来打电话ZipFile.
因此这个错误:
AttributeError: 'str' object has no attribute 'ZipFile'
Run Code Online (Sandbox Code Playgroud)
修复是不调用您的变量zipfile.
正如Jeff Langemeier所说,关键是:
不要使用与刚刚要求解决的导入相同的变量名称.B:不要使用与导入相同的变量名,这样就无法读取.C:不要使用与导入相同的变量名.
更一般地说,不要对两个不同的东西使用相同的名称.
对于你的第二个问题:
如何指定压缩级别
你不能.这是故意的,原因与zip命令行工具不再记录10级压缩,仅-0用于存储(无压缩)和-9"压缩更好"相同.除了存储或默认之外,几乎没有任何好的用途.-9通常不会比默认压缩更好 - 或者它更好地压缩一些文件而其他文件更糟糕.如果你需要更好的压缩,你需要一个更好的算法,例如,使用.tar.bz2的替代.zip,或使用p7zip(可创建ZIP兼容的文件),而不是简单的zip.
因此,Python的库只为您提供两种选择:存储或默认.正如文档所示:
class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])...
compression是编写存档时使用的ZIP压缩方法,应该是ZIP_STORED或ZIP_DEFLATED
同样适用于write/ writestr方法.
如果您真的想这样做,可以zlib.compress直接调用,直接创建ZipInfo对象,然后自己将其添加到存档中.如果你查看源代码(从文档链接),你可以看到writestr一旦你删除所有不相关的条件和类型检查,它真的不复杂.
但实际上,我认为你不想这样做.
所以我想我的评论也是答案.
你的变量基本上是"重载"对导入方法的调用,这使得你的代码非常糟糕.请遵循以下规则:
答:不要使用与您的导入相同的变量名称.
B:不要使用与导入相同的变量名,这样就无法读取.
C:不要使用与导入相同的变量名.
如果你遵循这个,它会拯救你和你问的人很多头痛.如果您这样做,请选择将其关闭,使用下划线分隔zip_file或filezip或其他任何内容.
| 归档时间: |
|
| 查看次数: |
8933 次 |
| 最近记录: |