zoukankan      html  css  js  c++  java
  • python 压缩模块大杂烩(zipfile,bz2,lzma,gzip,tarfile,zlib)

    [*] 以下压缩模块请结合python的官方文档(https://docs.python.org/3.5/library/index.html)来实践或者对比(我的是python 3.5)

    1.python-数据压与存档 zipfile压缩模块

    ZIPFILEM模块简介:
    ZIP文件格式是常见的归档和压缩标准。此模块提供用于创建,读取,写入,追加和列出ZIP文件的工具。任何高级使用此模块都需要了解PKZIP应用说明中定义的格式。此模
    块当前不处理多磁盘ZIP文件。它可以处理使用ZIP64扩展的ZIP文件(即大小超过4 GiB的ZIP文件)。它支持ZIP存档中加密文件的解密,但它目前无法创建加密文件。解密非常慢,因为它是在本机Python而不是C中实现的。

    1.zip压缩文件:

        import os
        import zipfile
        path = "wirtefile";
        list_test = []
        os.chdir("test")
        def f(path):  # 这里就是遍历输入的文件路径是否包含目录,前提是判断当前路径下的文件是否包含目录
        	for i in os.listdir(path):
        		if os.path.isdir(path+"\"+i) == True:
        			f(path+"\"+i)
        		list_test.append(path+"\"+i)
        f(path)
        with zipfile.ZipFile("../writefile.zip", "w") as zipf: # 调用zipfile模块的ZipFile方法生成对象
        	for i in list_test:   # 遍历整个目录文件
        		zipf.write(i) # 调用write方法进行压缩
    

    2.zip解压文件:

        import os
        import zipfile
        if zipfile.is_zipfile("writefile.zip"):  # 解压的话目录和文件都能操作
        	with zipfile.ZipFile("writefile.zip", "r") as zipf: 
        		zipf.extractall() # 调用extractall()方法进行解压也可以用extract方法,和这个类似推荐使用extractall这个方法
    

    3.不解压查看文件里面的内容:

        1.ZipFile.printdir() # 显示目录下所有文件的列表
        2.ZipFile.namelist()  # 显示单独的文件列表
    

    4.不解压查看文件里面的内容属性:

        第一种方法:
        info = ZipFile.getinfo(ZipFile.namelist()[1]) 
        print(info)
        第二种方法:
        for i in ZipFile.infolist(): 
        print(i)
    

    5.其他方法:

        (1)ZipFile.close():关闭ZipFile对象
        (2)ZipFile.setpassword(pwd):设置解压文件的密码
        (3)ZipFile.testzip():检查CRC校验和文件头
        (4)zipinfo对象的方法:(第四点的两种方法都可以返回zipinfo对象)
          ZipInfo.compress_type:		存档成员的压缩类型
          ZipInfo.comment:			对单个档案成员的评论
          ZipInfo.extra:			扩展现场数据
          ZipInfo.create_system:		创建ZIP存档的系统
          ZipInfo.create_version:		创建ZIP存档的PKZIP版本
          ZipInfo.extract_version:		提取存档需要PKZIP版本
          ZipInfo.reserved:			必须为零
          ZipInfo.flag_bits:			ZIP标志位
          ZipInfo.volume:			文件头的卷号
          ZipInfo.internal_attr:		内部属性
          ZipInfo.external_attr:		外部文件属性
          ZipInfo.header_offset:		字节偏移到文件头
          ZipInfo.CRC:				未压缩文件的CRC-32
          ZipInfo.compress_size:		压缩数据的大小
          ZipInfo.file_size:			未压缩文件的大小
    

    2.python-数据压与存档 bz2压缩模块

    1.bz2压缩文件:
    第一种方法:

        import os
        import bz2
        writefile = bz2.BZ2File("test\test.bz2", "wb") # bz2压缩文件也是以二进制压缩
        #  除了BZ2File()函数还有open(filename,mode ='r',compresslevel = 9,encoding = None,errors = None,newline = None )函数可以打开文件 */
        readfile = open("test\zlib.txt", "rb")
    
        data = readfile.read()
        writefile.write(data)
        
        writefile.close()
        readfile.close()
    

    第二种方法:

        import os
        import bz2
        bb = bz2.BZ2Compressor()
        
        writefile = open("test.bz2", "wb") 
        readfile = open("zlib.txt", "rb")
        
        data = readfile.read(1024) # 这边指定了一次压缩1024个字节,当然了解压的时候也要每1024个字节的解压。如果嫌麻烦就直接用data = readfile.read()一次性的全读出来,但处理较大的文件的时候就需要现就一下怎么提升效率。
        while data:
        	writefile.write(bb.compress(data))
        	data = readfile.read(1024)
        writefile.write(bb.flush()) # 压缩之后一定要将flush()处理过的信息写进去
        
        writefile.close()
        readfile.close()
    

    2.bz2解压文件:
    第一种方法:

        import os
        import bz2
        readfile = bz2.BZ2File("test\test.bz2", "rb")   #  记住一定是二进制形式的
        writefile = open("test\test.txt", "wb")
        
        data = readfile.read()
        writefile.write(data)
        
        readfile.close()
        writefile.close()
    

    第二种方法:

        import os
        import bz2
        bb = bz2.BZ2Decompressor()
        
        readfile = open("test.bz2", "rb") 
        writefile = open("test.txt", "wb")
        
        data = readfile.read(1024)
        while data:
        	writefile.write(bb.decompress(data))
        	data = readfile.read(1024)
        
        writefile.close()
        readfile.close()
    

    3.bz2的其他方法:

           
        # compress和decompress更多的用于一次压缩;
        # 而BZ2Decompressor和BZ2Compressor则是增量压缩(多次压缩并且添加到压缩文件中)
        (1)compress(data,compresslevel = 9) 
        # data就是传入的需要压缩的数据,可以从文件中读取也可以指定字符串压缩,比如a = "Hello World",文件的话 a = readfile,read(), b = bz2.compress(a, compresslevel=9), b就是压缩过的数据,灵活变通一下嘛
        (2)decompress()
        # 同上
    

    3.python-数据压与存档 lzma压缩模块

    1.lamz压缩文件:

        import lzma
        import os
    
        #    可以用open()方法也可以用lzma.LZMAFile()方法;
        #    区别是lzma.LZMAFile()方法只能打开二进制文件
       
        with lzma.open("file.xz", "wb") as writefile:
        	with open("zlib.txt", "rb") as readfile:
        		data = readfile.read(100)
        		while data:
        			writefile.write(data)
        			data = readfile.read(100)
    

    2.lamz解压文件:

        import lzma
        import os
        with lzma.open("file.xz", "rb") as readfile:
        	with open("zlib_test.txt", "wb") as writefile:
        		data = readfile.read(100)
        		while data:
        			writefile.write(data)
        			data = readfile.read(100)
    

    3.lamz的其他方法

    (1)lzma.LZMACompressor()和lzma.LZMADecompressor()都是增量压缩
    (2)compress()和decompress()方法用于压缩和解压   #和bz2的一样嘛
    

    4.python-数据压与存档 tarfile压缩模块

    1.tarfile压缩文件:

        import os
        import tarfile
        path = "wirtefile";
        list_test = []
        os.chdir("test")
        def f(path):
        	for i in os.listdir(path):
        		if os.path.isdir(path+"\"+i) == True:
        			f(path+"\"+i)
        		list_test.append(path+"\"+i)
        f(path)
        
            # w:gz 等同于 w|gz
            # open的第二个参数是w,那么压缩格式就对应着.tar 
            # open的第二个参数是w:gz,那么压缩格式就对应这.tar.gz
            # open的第二个参数是w:bz2,那么压缩格式就对应这.tar.bz2
            # open的第二个参数是r:xz,那么解压格式就对应这.tar.xz
       
        tar = tarfile.open("../test.tar", "w")
        for i in list_test:
        	tar.add(i)
        tar.close()
    

    2.tarfile解压文件:

        import os
        import tarfile
        
            # w:gz 等同于 w|gz 
            # open的第二个参数是r,那么解压格式就对应着.tar 
            # open的第二个参数是r:gz,那么解压格式就对应这.tar.gz
            # open的第二个参数是r:bz2,那么解压格式就对应这.tar.bz2
            # open的第二个参数是r:xz,那么解压格式就对应这.tar.xz
        
        tar = tarfile.open("test.tar", "r")//也可以用tarfile.TarFile()获取文件
        file_names = tar.getnames()
        for file_name in file_names:
        	tar.extract(file_name)
    

    3.用法其他:

    (1)TarFile.getmembers()和TarFile.getmember()两个函数返回TarInfo对象
    (2)TarFile.list()是打印文件的详细信息
    (3)TarInfo对象:
    TarInfo.name:			存档成员的名称
    TarInfo.size:			大小以字节为单位
    TarInfo.mtime:			最后修改的时间
    TarInfo.mode:			权限位
    TarInfo.type:			文件类型
    TarInfo.linkname:		目标文件名的名称
    TarInfo.uid:			最初存储此成员的用户的用户标识
    TarInfo.gid:			最初存储此成员的用户的组ID。
    TarInfo.uname:			用户名。
    TarInfo.gname:			团队名字。
    TarInfo.pax_headers:		包含关联的pax扩展头的键值对的字典
    TarInfo.isfile():		True如果Tarinfo对象是常规文件,则返回。
    TarInfo.isreg():		与...相同isfile()。
    TarInfo.isdir():		True如果是目录则返回。
    TarInfo.issym():		True如果它是符号链接则返回。
    TarInfo.islnk():		True如果是硬链接则返回。
    TarInfo.ischr():		True如果是角色设备则返回。
    TarInfo.isblk():		True如果它是块设备则返回。
    TarInfo.isfifo():		True如果是FIFO,则返回。
    TarInfo.isdev():		True如果是字符设备,块设备或FIFO之一,则返回。
    

    5.python-数据压与存档 zlib压缩模块

    1.zlib压缩文件:

        import os
        import zlib
        compress = zlib.compressobj(9) # 1-9,1表示速度最快,压缩率最低;9表示速度最慢但压缩率最高
        with open("zlib.txt", "rb") as readfile: # zlib的压缩是以二进制形式的压缩
        	with open("zlib_gz.txt", "wb") as writefile:
        		data = readfile.read(1024)
        		while data:
        			writefile.write(compress.compress(data))
        			data = readfile.read(1024)
        		writefile.write(compress.flush())
    

    2.zlib解压文件:

        import os
        import zlib
        decompress = zlib.decompressobj()
        with open("zlib.gz", "rb") as readfile:
        	with open("zlib_test.txt", "wb") as writefile:
        		data = readfile.read(1024)
        		while data:
        			writefile.write(decompress.decompress(data))
        			data = readfile.read(1024)
        		writefile.write(decompress.flush())
    

    3.其他方法:

    (1)Decompress.eof:一个布尔值,指示是否已到达压缩数据流的末尾
    

    6.python-数据压与存档 gzip压缩模块

    1.gzip压缩文件:
    第一种方法:

        import os
        import gzip
        with open("zlib.txt", "rb") as readfile:
        	with gzip.open("zlib.gz", "wb") as writefile: # open也有compresslevel参数
        		writefile.writelines(readfile)
    

    第二种方法:

         import os
         import gzip
         g = gzip.GzipFile(filename="", mode="wb", compresslevel=9, fileobj=open('test\zlib.gz', 'wb'))
         g.write(open('test\zlib.txt', "rb").read())
         g.close()
    

    2.gzip解压文件:
    第一种方法:

        import os
        import gzip
        with open("zlib_test.txt", "wb") as writefile:
        	with gzip.open("zlib.gz", "rb") as readfile:
        		writefile.write(readfile.read())
    

    第二种方法:

          import os
          import gzip
          g = gzip.GzipFile(mode="rb", fileobj=open('zlib.gz', 'rb'))
          open("test.txt", "wb").write(g.read())
    

    3.gzip的其他方法:
    (1)compress()
    (2)decompress()

    总结:本文的压缩模块有zipfile,bz2,lzma,gzip,tarfile,zlib这6个压缩模块其中能方便的文件夹压缩的有zipfile和tarfile这个2个,其他模块对单个文件压缩,或者说是字符串的二进制压缩(你懂我的意思吧)比较方便,至于压缩文件夹我还没想到好的方法。当然了以上的程序能完成对文件的基本压缩和解压,至于一些高级用法以及在官方文档中没用的函数等,比如压缩的进度控制,等有时间研究过后我在更新一下,呵呵…

    PS:如果认为我这个博客有什么问题或者有修改意见的,请一定要告诉我,非常感谢(我的邮箱2412875746@qq.com)

  • 相关阅读:
    hdu1238 Substrings
    CCF试题:高速公路(Targin)
    hdu 1269 迷宫城堡(Targin算法)
    hdu 1253 胜利大逃亡
    NYOJ 55 懒省事的小明
    HDU 1024 Max Sum Plus Plus
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1257 最少拦截系统
    HDU 1069 Monkey and Banana
    HDU 1104 Remainder
  • 原文地址:https://www.cnblogs.com/csnd/p/11800566.html
Copyright © 2011-2022 走看看