首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中指定zip文件的压缩级别?

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

Stack Overflow用户
提问于 2013-05-08 03:31:26
回答 2查看 9.9K关注 0票数 3

如何在python中压缩文件,以及如何指定压缩级别?

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

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

代码:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-08 03:38:45

这里的问题是这一行:

代码语言:javascript
复制
zipfile = file+'.zip'

在此之后,zipfile不再引用模块,而是引用此字符串。所以,当你这样做的时候:

代码语言:javascript
复制
output = zipfile.ZipFile(zipfile, 'wb')

您正在请求一个字符串,而不是一个模块来调用ZipFile

因此出现以下错误:

代码语言:javascript
复制
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是做什么的--只要去掉所有不相关的条件和类型检查,它就不复杂了。

但说真的,我不认为你想这么做。

票数 10
EN

Stack Overflow用户

发布于 2013-05-08 03:36:40

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

你的变量本质上是“重载”了对导入方法的调用,使得你的代码变得非常糟糕。因此,请遵循以下规则:

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

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

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

如果你遵循这一点,你和你问的人都会省去很多麻烦。如果这样做,请选择关闭它,使用下划线分隔zip_file、filezip或其他任何文件。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16427060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档