您的位置:

Python zlib库,什么是 Python 中的 zlib?

zlib 是一个支持 zlib C 库的 Python 库,zlib C 库是对缩减无损压缩算法的更高级概括。zlib库用于无损压缩,这意味着压缩和解压缩之间没有数据丢失)。

它还提供了跨不同平台的可移植性优势,并且不会扩展数据。

这个库在安全性方面起着非常重要的作用。许多应用需要压缩和解压缩任意数据,如字符串、文件或结构化内存内容。

这个库非常适合 gzip 文件格式/工具,是 UNIX 系统上最流行和最有用的压缩应用。

压缩()方法

zlib库方便我们使用compression()方法,用来压缩一个数据串。下面是函数的语法。


compress(data, level=-1)

参数-

  • data 参数指定要压缩的字节,级别表示介于-1 到 9 之间的整数值。level 参数用于定义压缩级别。9 级表示最慢;但是,它带来了最高的压缩级别。值-1 是 6 级默认值。0 级不会产生压缩。

让我们理解下面的例子。

示例-


import zlib
import binascii

value = 'Welcome to JavaTpoint'

compressed_data = zlib.compress(value, 2)

print('Original data: ' +  value)
print('Compressed data: ' + binascii.hexlify(compressed_data))

输出:

Original data: Welcome to JavaTpoint
Compressed data: 785ef348cdc9c95728cf2fca49010018ab043d

如果我们将值 2 改为 0,那么结果如下。


Original data: Welcome to JavaTpoint
Compressed data: 785ef348cdc9c95728cf2fca49010018ab043d

压缩大数据流

zlib库提供了 comressobj() 功能来管理大数据流。此方法返回压缩对象。语法如下。

语法-


compressobj(level=-1, method=DEFLATED, wbits=15, memLevel=8, strategy=Z_DEFAULT_STRATEGY[, zdict])

参数-

  • 上面的方法接受 wbits 作为处理窗口大小的参数,输出中包含头和尾。以下是的可能值

| 价值 | 窗口大小对数 | 输出 | | +9 至+15 | 基数 2 | 它包括 zlib 头部和尾部。 | | +9 至-15 | 表示 wbit 的绝对值 | 不包括标题和尾部。 | | +25 至+31 | 该值的低 4 位。 | 它包括报头和尾部校验和。 |

  • 方法参数定义了压缩中使用的算法。放气是默认的或者我们可以说当前可能的算法。
  • 策略参数定义了压缩调优。建议现在只使用其默认值。

让我们理解下面的例子

示例-


import zlib
import binascii

data = 'Welcome to JavaTpoint'

compress = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, zlib.DEFLATED, -15)
compressed_data = compress.compress(data)
compressed_data += compress.flush()

print('Original: ' + data)
print('Compressed data: ' + binascii.hexlify(compressed_data))

输出:

Original: Hello world
Compressed data: f348cdc9c95728cf2fca490100

解释-

我们取了一个简单的字符串值,它不是一个大数据流,它的目的是显示 compressobj() 函数的工作情况。字符串“欢迎使用 JavaTpoint”已被压缩。通常,当数据流太大或不适合内存时,使用这种方法。这种方法在一个更大的应用中起着至关重要的作用,在这个应用中,我们可以配置压缩,并且可以用来连续压缩部分数据。

它在需要压缩的地方起着重要的作用。借助compression . compression(data)方法,我们可以压缩和刷新数据块,而无需在内存中累积全部数据。

压缩文件

我们将使用压缩()方法来压缩文件。语法与前面的例子相似。

在下面的例子中,我们将压缩 PNG 图像“mountain.png”。

让我们理解下面的例子。

示例-


import zlib

original_data = open(r'C:\Users\DEVANSH SHARMA\Pictures\Saved Pictures\mountain.png', 'rb').read()
compressed_data = zlib.compress(original_data, zlib.Z_BEST_COMPRESSION)

compress_ratio = (float(len(original_data)) - float(len(compressed_data))) / float(len(original_data))
print('Compressed: %d%%' % (100.0 * compress_ratio))

输出:

Compressed: 10%

在上面的例子中,我们使用了 Z_BEST_COMPRESSION,这是该算法必须提供的最佳压缩级别。在下一行中,我们根据压缩数据长度与原始数据的比率来计算压缩级别。文件被压缩了 13%,这就是如何压缩 ASCII 字符串或二进制图像数据。

将压缩数据保存到文件

我们还可以将压缩的数据保存在一个文件中以供进一步使用。在下面的例子中,我们将一些压缩文本显示到一个文件中。

示例-


import zlib

my_data = 'Welcome to JavaTpoint'

compressed_data = zlib.compress(my_data, 2)

f = open('outfile.txt', 'w')
f.write(compressed_data)
f.close()

当我们运行上述程序时,它会压缩给定的字符串,并将压缩后的数据保存到一个名为“output.txt”的文件中。

解压

解压缩也是应用的一个重要方面。zlib库提供了解压()方法。下面是它的语法。

语法:


decompress(data, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE)

参数-

  • 数据参数是字节格式的值。
  • wbits 参数用于管理历史缓冲区的大小。可能的缓冲值如下。

| 价值 | 窗口大小对数 | 投入 | | +8 至+15 | 基数 2 | 它包括 zlib 头部和尾部 | | -8 到-15 岁 | 它代表了 wbits 的绝对优势 | 它包括没有头和尾的原始流 | | +24 至+31 = 16 + (8 至 15) | 它代表该值的低 4 位 | 它包括 gzip 标题和尾部 | | +40 至+47 = 32 + (8 至 15) | 它代表该值的低 4 位 | zlib 或 gzip 格式 |

  • bufsize 参数指示缓冲区大小。这个论点最好的一点是,它不需要精确;当需要额外的缓冲区时,它的值会自动增加。

让我们理解下面的例子。

示例-


import zlib
data = 'Welcome to JavaTpoint'

compressed_data = zlib.compress(data, 2)
decompressed_data = zlib.decompress(compressed_data)

print('Decompressed data: ' + decompressed_data)

输出:

Welcome to JavaTpoint

解压缩大数据流

在解压缩大数据流时,由于数据的大小或来源,我们可能会面临内存管理问题。我们有可能无法将所有可用的内存用于该特定任务。因此,解压缩 obj() 允许我们将一个大的流分成多个块,这些块可以单独解压缩。

语法如下。

语法-


decompressobj(wbits=15[, zdict])

上述方法返回解压对象,用于解压特定数据。

让我们理解下面的例子。

示例-


import zlib

data = 'Welcome to JavaTpoint'

compress = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, zlib.DEFLATED, +15)
compressed_data = compress.compress(data)
compressed_data += compress.flush()

print('Data before Decompress: ' + data)
print('Data After Decompress: ' + compressed_data)

f = open('compressed.datd', 'w')
f.write(compressed_data)
f.close()

CHUNKSIZE = 1024

data2 = zlib.decompressobj()
my_file = open('compressed.dat', 'rb')            
buffer_value = my_file.read(CHUNKSIZE)

# Decompress stream chunks
while buffer_value:
    decompressed_data = data2.decompress(buf)
    buf = my_file.read(CHUNKSIZE)

decompressed_data += data2.flush()

print('Decompressed data: ' + decompressed_data)

my_file.close()

输出:

Data Before Decompress: Welcome to JavaTpoint
Data After Decompress - #@$%%#@@#s
Decompressed Data: Welcome to JavaTpoint

从文件中解压缩数据

正如我们在前面的例子中所讨论的,我们可以轻松地解压缩文件中包含的数据。这个例子类似于前面的例子;我们从文件中获取数据,只是在这种情况下,我们将使用解压()方法。当数据小到可以很容易地放入内存时,这种方法很有用。

让我们理解下面的例子。

示例-


import zlib

compressed_data = open('hello.dat', 'rb').read()
decompressed_data = zlib.decompress(compressed_data)
print(decompressed_data)

解释-

我们已经阅读了包含“欢迎来到 JavaTpoint”的 hello.dat。但是,该文件包含一个小字符串,因此我们使用了解压缩()而不是解压缩 obj() 函数。

结论

当应用需要安全级别的压缩时,Python zlib库非常有用。它有一堆优秀的功能。我们已经讨论了 zlib库的一些重要概念,尽管有许多函数可用。压缩()和解压缩()方法用于小数据,而压缩 obj()和解压缩 obj()方法通过支持数据流的压缩/解压缩来提供更大的灵活性。