python压缩和解压缩模块之zlib的用法

目录
  • python压缩和解压缩模块之zlib
  • python中zlib库用法
    • zlib主要用于压缩与解压缩

python压缩和解压缩模块之zlib

由于早期的zlib和Python之间不兼容,故推荐1.1.4以后的版本。导入zlib后可以查看版本号

>>> import zlib
>>> zlib.ZLIB_VERSION
'1.2.11'
>>> zlib.ZLIB_RUNTIME_VERSION
'1.2.11'

zlib中封装了两对压缩和解压的函数

压缩 解压
compress decompress
compressobj decompressobj

其中compress和decompress比较简单,二者声明为

zlib.compress(data, level=-1)
zlib.decompress(data, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE)

即分别对data进行压缩和解压。

其中level为整数,用于指定压缩等级,决定压缩后文件的大小,取值为-1到9。

zlib中内置了四个常量,用以表示四种情况。

    压缩模式
1 Z_BEST_SPEED 最快速度和最低压缩率
9 Z_BEST_COMPRESSION 最慢速度最高压缩率
0 Z_NO_COMPRESSION 不压缩
-1 Z_DEFAULT_COMPRESSION 一般相当于设压缩等级为6

解压函数中的wbits控制历史缓冲区的大小(或称“窗口大小”)以及所期望的头部和尾部格式。

默认为MAX_WBITS,其取值范围和含义如下

  包含头尾  
+8至+15 必须 窗口尺寸以二为底的对数。输入必须包含zlib头部和尾部。
0 必须含头 根据 zlib 头部自动确定窗口大小
−8至−15 无头尾 使用wbits绝对值作为窗口大小以二为底的对数
+24至+31 必须包含 使用后4个比特位作为窗口大小以二为底的对数。
+40 至+47 自动 使用后4个比特位作为窗口大小以二为底的对数

bufsize是表示缓冲区初始大小,默认为DEF_MEM_LEVEL,由于在解压过程中会自动调节,故不必完全精确。

例如:

>>> x = b'abcdefghijk'*100
>>> x0 = compress(x,0)
>>> x1 = compress(x,1)
>>> x9 = compress(x,9)
>>> print(len(x),len(x0), len(x1), len(x9))
1100 1111 32 29 #无压缩时得到的数据比原始数据还大
>>> d1 = decompress(x9) #解压缩
>>> d1 == x
True
  • compressobjdecompressobj分别返回一个压缩对象和解压对象。
  • compressobj返回一个 压缩对象,用来压缩内存中难以容下的数据流,声明如下
compressobj(level=-1, method=DEFLATED, wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=Z_DEFAULT_STRATEGY[, zdict])

其中level为压缩级别,和前文一样取值为 -1 到 9;method 表示压缩算法,现在只支持 DEFLATED;memLevel指定内部压缩操作时所占用内存大小。参数取 1 到 9,默认DEF_MEM_LEVEL,取值越大越占内存,但速度更快。

wbits 和decompress中相似,但取值范围更少,默认是15(MAX_WBITS)。

参数范围如下:

   
+9 至 +15 窗口大小以二为底的对数。 即这些值对应着 512 至 32768 的窗口大小。 更大的值会提供更好的压缩,同时内存开销也会更大。 压缩输出会包含 zlib 特定格式的头部和尾部。
−9 至 −15 绝对值为窗口大小以二为底的对数。 压缩输出仅包含压缩数据,没有头部和尾部。
+25 至 +31 后 4 个比特位为窗口大小以二为底的对数。 压缩输出包含一个基本的 gzip 头部,并以校验和为尾部。
  • strategy 用于调节压缩算法,默认即可。
  • zdict 指定预定义的压缩字典。是一个字节序列,其中包含用户认为要压缩的数据中可能频繁出现的子序列。频率高的子序列应当放在字典的尾部。

除了压缩和解压缩,zlib还提供了两个数据校验的函数,

函数 算法  
zlib.adler32 Adler-32校验  
zlib.crc32 CRC(循环冗余)校验  

二者均输入数据和校验起始值,校验起始值value默认为1。这两个函数仅为验证数据的正确性,均无加密强度,不适合做密码。

>>> zlib.adler32(b'abcdefghijk')
434701411
>>> zlib.crc32(b'abcdefghijk')
3461812127

python中zlib库用法

zlib主要用于压缩与解压缩

  • 字符串:使用zlib.compress可以压缩字符串。使用zlib.decompress可以解压字符串。
  • 数据流:压缩:compressobj,解压:decompressobj

示例代码:

import zlib

data = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz' \
       'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
print(len(data))
print(data)

# 压缩
compressed_data = zlib.compress(data.encode())  # 注意:这儿要以字节的形式传入
print(len(compressed_data))
print(compressed_data)

# 解压
new_data = zlib.decompress(compressed_data).decode()
print(len(new_data))
print(new_data)

运行结果:

示例代码2:

import zlib

# 压缩文件或数据
def compress_data(file, zip_file, level=9):
    file = open(file, 'rb')
    zip_file = open(zip_file, 'wb')
    compress = zlib.compressobj(level)
    data = file.read(1024)
    while data:
        zip_file.write(compress.compress(data))
        data = file.read(1024)
    zip_file.write(compress.flush())
    file.close()
    zip_file.close()

# 解压文件或数据
def decompress_data(zip_file, new_file):
    zip_file = open(zip_file, 'rb')
    new_file = open(new_file, 'wb')
    decompress = zlib.decompressobj()
    data = zip_file.read(1024)
    while data:
        new_file.write(decompress.decompress(data))
        data = zip_file.read(1024)
    new_file.write(decompress.flush())
    zip_file.close()
    new_file.close()

if __name__ == '__main__':
    file = 'text.txt'
    zip_file = 'text_zip.txt'
    compress_data(file, zip_file)

    new_file = 'test_new.txt'
    decompress_data(zip_file, new_file)
    print('end!')

运行结果:

注意:

compressobj返回一个压缩对象,用来压缩不能一下子读入内存的数据流。

level 从9到-1表示压缩等级,其中1最快但压缩度最小,9最慢但压缩度最大,0不压缩,默认是-1大约相当于与等级6,是一个压缩速度和压缩度适中的level。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python用模块zlib压缩与解压字符串和文件的方法

    python中zlib模块是用来压缩或者解压缩数据,以便保存和传输.它是其他压缩工具的基础.下面来一起看看python用模块zlib压缩与解压字符串和文件的方法.话不多说,直接来看示例代码. 例子1:压缩与解压字符串 import zlib message = 'abcd1234' compressed = zlib.compress(message) decompressed = zlib.decompress(compressed) print 'original:', repr(messa

  • 在Python中使用zlib模块进行数据压缩的教程

    Python标准模块中,有多个模块用于数据的压缩与解压缩,如zipfile,gzip, bz2等等.上次介绍了zipfile模块,今天就来讲讲zlib模块. zlib.compress(string[, level]) zlib.decompress(string[, wbits[, bufsize]]) zlib.compress用于压缩流数据.参数string指定了要压缩的数据流,参数level指定了压缩的级别,它的取值范围是1到9.压缩速度与压缩率成反比,1表示压缩速度最快,而压缩率最低,

  • python通过zlib实现压缩与解压字符串的方法

    本文实例讲述了python通过zlib实现压缩与解压字符串的方法.分享给大家供大家参考.具体实现方法如下: 使用zlib.compress可以压缩字符串.使用zlib.decompress可以解压字符串.如下 复制代码 代码如下: #coding=utf-8 import zlib s = "hello word, 00000000000000000000000000000000" print len(s) c = zlib.compress(s) print len(c) d = 

  • Python实现压缩和解压缩ZIP文件的方法分析

    本文实例讲述了Python实现压缩和解压缩ZIP文件的方法.分享给大家供大家参考,具体如下: 有时我们需要在 Python 中使用 zip 文件,而在1.6版中,Python 就已经提供了 zipfile 模块可以进行这样的操作.不过 Python 中的 zipfile 模块不能处理多卷的情况,不过这种情况并不多见,因此在通常情况下已经足够使用了.下面我只是对一些基本的 zipfile 操作进行了记录,足以应付大部分的情况了. zipfile 模块可以让你打开或写入一个 zip 文件.比如: i

  • python压缩和解压缩模块之zlib的用法

    目录 python压缩和解压缩模块之zlib python中zlib库用法 zlib主要用于压缩与解压缩 python压缩和解压缩模块之zlib 由于早期的zlib和Python之间不兼容,故推荐1.1.4以后的版本.导入zlib后可以查看版本号 >>> import zlib >>> zlib.ZLIB_VERSION '1.2.11' >>> zlib.ZLIB_RUNTIME_VERSION '1.2.11' zlib中封装了两对压缩和解压的函数

  • 使用Python读写及压缩和解压缩文件的示例

    读写文件 首先看一个例子: f = open('thefile.txt','w') #以写方式打开, try: f.write('wokao') finally: f.close() 文件的打开方式: f = open('文件','mode') 'r':只读(缺省.如果文件不存在,则抛出错误) 'w':只写(如果文件不存在,则自动创建文件),此时无法调用f.read()方法,且当调用f.write()时,将清空文件原有内容 'a':附加到文件末尾 'r+':读写 如果需要以二进制方式打开文件,需

  • python 实现压缩和解压缩的示例

    一.说明 压缩和解压缩是日常常用的操作,不管是windows上图形界面的操作,还是linux上用命令来进行压缩解压缩,总的而言都还是比较方便的. 但用代码来实现就没做过,近期也得实现代码压缩与解压缩操作,所以就抽时间来研究一下. 二.zip文件压缩和解压缩实现 import os import zipfile # 函数功能是zip_file_list所有文件,和zip_dir_list所有目录下的所有文件,被压缩到一个zip_file_name的压缩文件中 def my_zip_function

  • 基于Node.js实现压缩和解压缩的方法

    压缩格式 zip 和 gzip 是两种我们最常见到的压缩格式,当然,gzip 在 Windows 下很少有人接触. tar 是一种归档格式,它默认不会压缩,需要结合 gzip 来将最终的 tar 文件以 gzip 格式压缩成为一个 tar.gz 文件,通常我们会缩写为 tgz. 为什么没有提到 rar?因为它是专利保护的算法,你可以免费获得解压工具,而压缩工具是需要付费的.所以我们一般应用场景下,很少会提供 rar 压缩文件. 本文将分别介绍 gzip,tar,tgz 和 zip 的压缩和解压缩

  • Python3压缩和解压缩实现代码

    一.说明 压缩和解压缩是日常常用的操作,不管是windows上图形界面的操作,还是linux上用命令来进行压缩解压缩,总的而言都还是比较方便的. 但用代码来实现就没做过,近期也得实现代码压缩与解压缩操作,所以就抽时间来研究一下. 二.zip文件压缩和解压缩实现 import os import zipfile # 函数功能是zip_file_list所有文件,和zip_dir_list所有目录下的所有文件,被压缩到一个zip_file_name的压缩文件中 def my_zip_function

  • java 压缩和解压缩Zip、Jar、Gzip文件实例代码

    我们经常会使用WinZIP等压缩软件将文件进行压缩以方便传输.在java里面也提供了将文件进行压缩以减少传输时的数据量的类,可以很方便的将文件压缩成ZIP.JAR.GZIP等形式,GZIP主要是在Linux系统下的压缩文件. 下面主要讲的就是ZIP形式的压缩文件,而JAR.GZIP形式的压缩文件也是类似的用法. ZIP是一种很常见的压缩形式,在java中要实现ZIP的压缩主要用到的是java.util.zip这个包里面的类.主要有ZipFile. ZipOutputStream.ZipInput

  • Linux的压缩和解压缩的方法总结

    Linux的压缩和解压缩的方法总结 一 常用的压缩格式 .zip .gz .bz2 .tar.gz .tar.bz2 二 .zip格式压缩 1.语法 zip 压缩文件名 源文件名 压缩文件 zip -r 压缩文件名 源目录 压缩目录 unzip 压缩文件 解压缩.zip文件 2.说明 .zip的格式在windows和LInux是通用的. 3.实战 root@localhost test]# ls abc cdf [root@localhost test]# zip abc.zip abc add

  • 用ASP.Net实现文件的在线压缩和解压缩

    我们经常会遇到批量上传的问题,也会遇到将某个目录下所有文件都上传到服务器上的问题.那么,如何解决此类问题呢?以前的技术一般采用ActiveX等方式,这里笔者采用SharpZlib来实现,听说VS2005已有压缩和解压缩的解决方案,笔者还没有时间用VS2005,所以就只好使用VS2003 + SharpZlib来解决问题了. 1.首先从这里下载0.84版本的SharpZlib源码及示例码. 2.下载下来之后你发现它没有VS2003的解决方案文件,没有关系.你可以自己建立,首先新建一个ZipUnzi

  • C#文件流进行压缩和解压缩的方法

    本文实例讲述了C#文件流进行压缩和解压缩的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.IO.Compression; using System.Linq; using System.Text; usi

随机推荐