IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]10.5 zipfile--支持ZIP压缩包

    caimouse发表于 2016-05-15 08:16:42
    love 0

    ZIP文件格式是一个通用的压缩包,本模块主要提供了对这种格式文件进行创建、读取、写入、增加和读取文件列表。本模块不支持多卷压缩的功能,普通的ZIP文件只能4G大小,如果想使用更大的文件要使用ZIP64扩展方式。本模块支持打开有加密的压缩包文件,但不支持创建加密的压缩包文件,并且解密的速度比C语言的方式实现要慢。

     

    exception zipfile.BadZipFile

    当解压ZIP文件出错时抛出此异常。

     

    exception zipfile.BadZipfile

    兼容旧的异常,从Python3.2版本之后丢弃使用。

     

    exception zipfile.LargeZipFile

    当打开ZIP64压缩的文件时,但设置不允许支持这种格式时就会抛出异常。

     

    class zipfile.ZipFile

    定义读写ZIP文件的类。

     

    class zipfile.PyZipFile

    创建一个ZIP压缩类,包含Python库。

     

    class zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))

    创建一个表示压缩包的信息类。

     

    zipfile.is_zipfile(filename)

    判断文件名的ZIP文件或文件对象是否为合法的ZIP文件,如果是返回True,否则返回False。

     

    zipfile.ZIP_STORED

    表示非压缩的常量。

     

    zipfile.ZIP_DEFLATED

    表示采用ZIP压缩的常量。

     

    zipfile.ZIP_BZIP2

    表示采用BZIP2压缩的常量。

     

    zipfile.ZIP_LZMA

    表示采用LZMA压缩的常量。

     

    10.5.1 ZipFile对象

    class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True)

    打开ZIP文件,参数file可以压缩文件的名称或文件对象。参数mode是表示对压缩文件进行读或写,如果是w表示是写入,会清空文件已经存在的所有数据,再从头开始写入;参数compression是表示采用什么方式压缩,默认是存储不压缩;参数allowZip64是表示是否使用64位扩展的ZIP文件格式。

     

    ZipFile.close()

    关闭压缩包,在退出程序之前要调用此函数关闭,否则会丢失刚写入的数据。

     

    ZipFile.getinfo(name)

    返回一个ZipInfo对象。如果没有定义ZipInfo对象,就会抛出异常KeyError。

     

    ZipFile.infolist()

    返回压缩包里每个文件的ZipInfo对象列表。

     

    ZipFile.namelist()

    返回压缩里文件列表。

     

    ZipFile.open(name, mode='r', pwd=None)

    从一个压缩包里抽取一个文件,返回此文件对象。参数name是压缩包里的文件列表里的文件名称或者ZipInfo对象;参数mode是打开文件的模式,支持r,U,rU模式;参数pwd是打开压缩文件的密码。

     

    ZipFile.extract(member, path=None, pwd=None)

    从压缩包里抽取一个文件放到当前工作的目录下,参数member是文件名称或者ZipInfo对象;参数path是指定抽取文件放入的目标路径;参数pwd是解压的密码。

     

    ZipFile.extractall(path=None, members=None, pwd=None)

    从压缩包里抽取所有文件到当前工作的目录下,如果参数path设置就放到这个目录下面;参数members是可选的参数,如果设置,就是这部分的文件解压出来,并且设置文件列表要小于压缩包里所有文件的列表;参数pwd是解压的密码。

     

    ZipFile.printdir()

    以表格的形式把压缩包的信息向sys.stdout输出。

     

    ZipFile.setpassword(pwd)

    设置默认解压缩包的密码。参数pwd是解压密码。

     

    ZipFile.read(name, pwd=None)

    读取压缩包里指定的文件,返回相应数据。参数name是压缩包里指定的文件名称;参数pwd是解压的密码。

     

    ZipFile.testzip()

    读取压缩包里所有文件,并检查CRC和文件头是否正确,如果不正确返回第一个出错的文件名称;如果全部正确返回None。

     

    ZipFile.write(filename, arcname=None, compress_type=None)

    写文件名称filename的文件到压缩包。参数filename是要写入压缩的文件路径;参数arcname是写入的文件在压缩包里的文件名称;参数compress_type是指定压缩的方式,也即是不使用构造函数时的压缩级别。

     

    ZipFile.writestr(zinfo_or_arcname, bytes[, compress_type])

    写入字符串bytes到压缩包。参数zinfo_or_arcname是ZipInfo命名,还arcname名称命名;参数bytes是要写压缩包的名称;参数compress_type是压缩的类型。

     

    ZipFile.debug

    调试信息的输出的级别,可以设置从0到3,0表示没有调试信息输出,3表示输出尽可能多的信息。默认调试信息从sys.stdout输出。

     

    ZipFile.comment

    ZIP文件的备注信息,写入备注信息时需要压缩文件按a或w打开,并且备注信息不超过65535个字节。


    10.5.2 PyZipFile对象

    class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)

    打开一个PyZipFile文件对象,参数与ZipFile类构造函数一样。

     

    writepy(pathname, basename='', filterfunc=None)

    搜索所有*.py文件,并添加到压缩包。参数pathname是一个文件名称,必须带有py后缀的文件,并且会把pyc或者pyo文件添加到压缩包;如果参数pathname是一个目录,在这个目录下面所有的.py文件都会添加到压缩包,同时会根据参数optimize来决定选择添加pyo文件,还是pyc文件。参数basename是内部使用;参数filterfunc是带有单一参数的函数,用来判断传送入来的文件是否添加到压缩包,如果返回False就不添加到压缩包。

     


    10.5.2 ZipInfo对象

    从函数getinfo()和infolist()返回ZipInfo对象,每个对象的属性如下:

    ZipInfo.filename

    在压缩包里文件的名称。

     

    ZipInfo.date_time

    文件在压缩包里最后修改的时间。

     

    ZipInfo.compress_type

    采用什么压缩类型。

     

    ZipInfo.comment

    每个文件的备注信息。

     

    ZipInfo.extra

    压缩方法另外使用的数据。

     

    ZipInfo.create_system

    创建ZIP的系统名称。

     

    ZipInfo.create_version

    创建ZIP压缩包的PKZIP版本。

     

    ZipInfo.extract_version

    解压此压缩包的要求的PKZIP版本。

     

    ZipInfo.reserved

    保留字节,必须设置为0。

     

    ZipInfo.flag_bits

    ZIP标志位。

     

    ZipInfo.volume

    文件头的卷号。

     

    ZipInfo.internal_attr

    内部属性。

     

    ZipInfo.external_attr

    额外的文件属性。

     

    ZipInfo.header_offset

    相对文件头的偏移位置。

     

    ZipInfo.CRC

    未压缩时文件的CRC32校验码。

     

    ZipInfo.compress_size

    文件压缩之后数据的大小。

     

    ZipInfo.file_size

    文件未压缩之前的大小。

     

    创建Zip文件的例子:

    #python 3.4

    import zipfile

     

    zf = zipfile.ZipFile('F:\\temp\\py\\test.zip', mode = 'w')

    try:

        zf.write('F:\\temp\\py\\readme.txt')

        print('写入文件')

    finally:

        zf.close()

        print('关闭')

    结果输出如下:

    写入文件

    关闭

     

    追加文件的例子:

    #python 3.4

    import zipfile

     

    zf = zipfile.ZipFile('F:\\temp\\py\\test.zip', mode = 'a')

    try:

        zf.write('F:\\temp\\py\\readme2.txt')

        print('写入文件')

    finally:

        zf.close()

        print('关闭')

    结果输出如下:

    写入文件

    关闭

    从追加文件例子看来,与创建Zip文件的例子相比,主要是写入的模式mode不同,创建使用w的模式,而追加是使用a的模式。

     

    打开Zip文件的例子:

    #python 3.4

    import zipfile

     

    #判断文件是否一个有效的ZIP文件

    filename = 'F:\\temp\\py\\test.zip'

    print('F:\\temp\\py\\test.zip: ', zipfile.is_zipfile(filename))

    zf = zipfile.ZipFile(filename, mode = 'r')

    #读取压缩包里的文件列表

    print(zf.namelist())

    for fn in zf.namelist():

        data = zf.read(fn)

        print(fn)

        print(repr(data))

    zf.close()

    结果输出如下:

    F:\temp\py\test.zip:  True

    ['temp/py/readme.txt', 'temp/py/readme2.txt']

    temp/py/readme.txt

    b'http://blog.csdn.net/caimouse\r\nhttp://blog.csdn.net/caimouse\r\nhttp://blog.csdn.net/caimouse'

    temp/py/readme2.txt

    b'http://blog.csdn.net/caimouse\r\nhttp://blog.csdn.net/caimouse\r\nhttp://blog.csdn.net/caimouse'

     

    打包py文件的例子:

    #python 3.4

    import zipfile

     

    #判断文件是否一个有效的ZIP文件

    filename = 'F:\\temp\\py\\testpy.zip'

    zf = zipfile.PyZipFile(filename, mode = 'w')

    try:

        zf.debug = 3

        zf.writepy('F:\\temp\\py')

    finally:

        zf.close()

        for name in zf.namelist():

            print(name)

    zf.close()

    结果输出如下:

    Adding files from directory F:\temp\py

    Compiling F:\temp\py\bisect2.py

    Adding bisect2.pyc

    Compiling F:\temp\py\cal_1.py

    Adding cal_1.pyc

    Compiling F:\temp\py\chainmap1.py

    Adding chainmap1.pyc

    Compiling F:\temp\py\chainmap2.py

    Adding chainmap2.pyc

    Compiling F:\temp\py\closescreen.py

    Adding closescreen.pyc

    Compiling F:\temp\py\codecs1.py

    Adding codecs1.pyc

    Compiling F:\temp\py\complex1.py

    Adding complex1.pyc

    Compiling F:\temp\py\copy1.py

    Adding copy1.pyc

    Compiling F:\temp\py\datetimetz.py

    Adding datetimetz.pyc

    Compiling F:\temp\py\dec1.py

    Adding dec1.pyc

    Compiling F:\temp\py\difflib1.py

    Adding difflib1.pyc

    Compiling F:\temp\py\difflib2.py

    Adding difflib2.pyc

    Compiling F:\temp\py\difflib3.py

    Adding difflib3.pyc

    Compiling F:\temp\py\difflib4.py

    Adding difflib4.pyc

    Compiling F:\temp\py\difflib5.py

    Adding difflib5.pyc

    Compiling F:\temp\py\test888.py

    Adding test888.pyc

    bisect2.pyc

    cal_1.pyc

    chainmap1.pyc

    chainmap2.pyc

    closescreen.pyc

    codecs1.pyc

    complex1.pyc

    copy1.pyc

    datetimetz.pyc

    dec1.pyc

    difflib1.pyc

    difflib2.pyc

    difflib3.pyc

    difflib4.pyc

    difflib5.pyc

    test888.pyc

     

    蔡军生  QQ:9073204  深圳



沪ICP备19023445号-2号
友情链接