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)

  • 相关阅读:
    深入浅出之正则表达式(一)
    Windows平台下构建 Android 开发环境( Android SDK 下载及安装教程)
    Eclipse 安装配置总结
    JDK安装配置教程
    关于磁力链接(Magnet URI)的简单介绍
    C# ASP.NET里的@妙用,字符串换行
    颜色中英文对照表 CSS
    使用git 工具下载android.jar Source Code
    ASP.NET表单提交之Get和Post的区别
    深入浅出之正则表达式(二)
  • 原文地址:https://www.cnblogs.com/csnd/p/11800566.html
Copyright © 2011-2022 走看看