python zip文件 压缩1

有时我们需要在 Python 中使用 zip 文件,而在1.6版中,Python 就已经提供了 zipfile 模块可以进行这样的操作。不过 Python

中的 zipfile 模块不能处理多卷的情况,不过这种情况并不多见,因此在通常情况下已经足够使用了。下面我只是对一些基本的

zipfile 操作进行了记录,足以应付大部分的情况了。

zipfile 模块可以让你打开或写入一个 zip 文件。比如:

import zipfile

z = zipfile.ZipFile(‘zipfilename’, mode=’r')

这样就打开了一个 zip 文件,如果mode为’w'或’a'则表示要写入一个 zip 文件。如果是写入,则还可以跟上第三个参数:

compression=zipfile.ZIP_DEFLATED

compression=zipfile.ZIP_STORED

ZIP_DEFLATED是压缩标志,如果使用它需要编译了zlib模块。而后一个只是用zip进行打包,并不压缩。

在打开了zip文件之后就可以根据需要是读出zip文件的内容还是将内容保存到 zip 文件中。

读出zip中的内容

很简单,zipfile 对象提供了一个read(name)的方法。name为zip文件中的一个文件入口,执行完成之后,将返回读出的内容,你把

它保存到想到的文件中即可。

写入zip文件

有两种方式,一种是直接写入一个已经存在的文件,另一种是写入一个字符串。

对于第一种使用 zipfile 对象的 write(filename, arcname, compress_type),后两个参数是可以忽略的。第一个参数是文件名,

第二个参数是表示在 zip 文件中的名字,如果没有给出,表示使用与filename一样的名字。compress_type是压缩标志,它可以覆

盖创建 zipfile 时的参数。第二种是使用 zipfile 对象的 writestr(zinfo_or_arcname, bytes),第一个参数是 zipinfo 对象或

写到压缩文件中的压缩名,第二个参数是字符串。使用这个方法可以动态的组织文件的内容。

需要注意的是在读出时,因为只能读出内容,因此如果想实现按目录结构展开 zip 文件的话,这些操作需要自已来完成,比如创建

目录,创建文件并写入。而写入时,则可以根据需要动态组织在 zip 文件中的目录结构,这样可以不按照原来的目录结构来生成

zip 文件。

于是我为了方便使用,创建了自已的一个 ZFile 类,主要是实现象 winrar 的右键菜单中的压缩到的功能–即将一个zip文件压缩

到指定目录,自动创建相应的子目录。再有就是方便生成 zip 文件。类源码为:

import zipfile
import os.path
import os

class ZFile(object):
    def __init__(self, filename, mode=’r', basedir=”):
        self.filename = filename
        self.mode = mode
        if self.mode in (‘w’, ‘a’):
            self.zfile = zipfile.ZipFile(filename, self.mode, compression=zipfile.ZIP_DEFLATED)
        else:
            self.zfile = zipfile.ZipFile(filename, self.mode)
        self.basedir = basedir
        if not self.basedir:
            self.basedir = os.path.dirname(filename)
       
    def addfile(self, path, arcname=None):
        path = path.replace(‘//’, ‘/’)
        if not arcname:
            if path.startswith(self.basedir):
                arcname = path[len(self.basedir):]
            else:
                arcname = ”
        self.zfile.write(path, arcname)
           
    def addfiles(self, paths):
        for path in paths:
            if isinstance(path, tuple):
                self.addfile(*path)
            else:
                self.addfile(path)
           
    def close(self):
        self.zfile.close()
       
    def extract_to(self, path):
        for p in self.zfile.namelist():
            self.extract(p, path)
           
    def extract(self, filename, path):
        if not filename.endswith(‘/’):
            f = os.path.join(path, filename)
            dir = os.path.dirname(f)
            if not os.path.exists(dir):
                os.makedirs(dir)
            file(f, ‘wb’).write(self.zfile.read(filename))
           
       
def create(zfile, files):
    z = ZFile(zfile, ‘w’)
    z.addfiles(files)
    z.close()
   
def extract(zfile, path):
    z = ZFile(zfile)
    z.extract_to(path)
    z.close()

这个 zfile.py 模块提供了两个方法:create和extract,还有一个 ZFile 的类。create和extract用来创建和解压 zip 文件。

create需要两个参数,第一个为要生成的zip文件名,第二个为一个文件列表,它是一个list变量,每一项或者是一个字符串文件名

,或者是一个tuple,第一个为文件名,第二个为在压缩文件中的名字,可以有路径,如:

['d:/a.csv', 'd:/test/a.JPG', ('d:/test/mixin/main.py', 'main.py')]

那么对于文件名有以下的处理,如果文件列表中的文件名与压缩文件名的路径相同,则在压缩文件中会自动变成相对路径。比如上

面的文件列表,如果压缩文件为:

d:/aaaa.zip

则在压缩文件中的压缩文件名最终为:

['a.csv', 'test/a.JPG', 'main.py']

那么最后一个因为指定了在压缩文件中的名字,因此使用指定的名字。

extrace需要两个参数,第一个为压缩文件名,第二个为解压到的路径名。

这两个方法都使用了 ZFile 类。ZFile 类则提供了一些更底层些的类。它的构造函数可以根据mode的值来选择是打开还是写入。另

外如果还想做更底层的控制,可以通过 ZFile 实例得到 zfile  属性,它是一个 ZipFile 模块实例,可以直接使用。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值