Python学习笔记24:进阶篇(十三)常见标准库使用之数据压缩功能模块zlib,gzip,bz2,lzma的学习使用

前言

本文是根据python官方教程中标准库模块的介绍,自己查询资料并整理,编写代码示例做出的学习笔记。

根据模块知识,一次讲解单个或者多个模块的内容。

教程链接:https://docs.python.org/zh-cn/3/tutorial/index.html

数据压缩

很多时候我们可以利用的内存有限,时间有限,资源有限,但是又不得不进行一些大量数据的操作时,我们可以通过压缩的方式灵活高效地处理数据存储和传输问题,优化应用性能。
在Python中,通过特定的算法,将原始数据转换成一个更紧凑的形式,这个过程称为压缩;而将压缩后的数据恢复到原始形式的过程则称为解压缩。这里简单了解一些这些模块后,一个个进行学习使用。

  1. zlib:
    介绍:zlib 模块提供了对 zlib 压缩库的接口,支持 gzip 文件格式的压缩和解压缩。
    功能:可以用于数据的简单压缩和解压缩,常用于需要快速压缩速度和相对较高压缩率的场合。
    常用函数:compress(), decompress(), crc32() 等。
  2. gzip:
    介绍:gzip 模块允许你使用 gzip 文件格式进行压缩和解压缩操作。
    功能:提供了文件对象(如 GzipFile)来处理 .gz 文件,可以透明地读写压缩文件,就像它们是普通文件一样。
    常用类:GzipFile 类用于创建或读取 gzip 格式的文件。
  3. bz2:
    介绍:此模块提供了对 bzip2 压缩算法的支持。
    功能:相较于 zlib,bzip2 提供了更高的压缩比,但压缩速度较慢。适用于需要高压缩比而时间不是关键因素的场景。
    常用类:BZ2File 类用于读写 bzip2 格式的文件。
  4. lzma:
    介绍:lzma 模块提供了对 LZMA (Lempel-Ziv-Markov chain Algorithm) 压缩算法的支持,这是 xz 文件格式的基础。
    功能:LZMA 提供了非常高的压缩比,特别适合于大文件的压缩。它在解压速度上也表现良好。
    常用类:LZMAFile 类用于读写 xz 格式的文件,以及相关的压缩和解压缩函数。
    这些模块使得Python能够方便地处理各种常见的压缩格式,满足不同的数据压缩需求。

zlib

zlib模块是Python的标准库之一,它提供了对zlib压缩库的接口,支持DEFLATE压缩算法,这是一种广泛使用的数据压缩算法,也是gzip、zip等文件格式的基础。zlib模块主要用于需要快速压缩速度和相对较高压缩率的场合,比如网络数据传输、文件存储等。

压缩与解压

import zlib

data = b"This is an example of compressed data."
# 压缩
compressed_data = zlib.compress(data)
# 解压
decompressed_data = zlib.decompress(compressed_data)
print(decompressed_data.decode())

在这里插入图片描述

通过输出可以看出,字符串压缩再解压后打印,并没有什么影响。

这里单独要讲2个点。

  1. 字符串前面的b是什么?
    这个b表示后面的字符串会被处理成一个字节串。因为compress函数的入参就是一个字节串,直接传入字符串是不行的。为什么字节串可以字符串不行呢?因为zlib这个模块处理的就是原始的二进制数据,而不是文本字符串。字符串在计算机内存中是以特定的字符编码(如UTF-8)表示的,而压缩算法直接作用于这些二进制表示上。
    有没有类似的写法呢?这里随便讲几个,以后遇到这种类似的写法可以查查资料学习一下:

    字符串前的u前缀(Python 2中):在Python 2中,字符串前加u表示创建一个Unicode字符串。例如,u"Hello, World!"。Python 3中默认字符串就是Unicode,因此不再需要u前缀。

    字符串前的r前缀:表示创建一个原始字符串(rawstring),其中的转义字符不会被处理。这在编写正则表达式或Windows文件路径时特别有用。例如,r"C:\path\to\file.txt"。

    字符串前的f前缀:这个就不用多讲了,格式化字符串,用来替换字符串中某些特定的值

  2. 怎么压缩中文?
    这个问题其实和1有关,还是那句话。这个模块处理的是二进制数据,所以要压缩中文,先把中文转成二进制数据就好了。

    # 待压缩的字符串
    text = '大家好,我是明月望秋思'
    
    # 将字符串转换为字节串(这里使用UTF-8编码)
    data = text.encode('utf-8')
    
    # 使用zlib进行压缩
    compressed_data = zlib.compress(data)
    
    # 解压缩,先确保数据被正确压缩,然后解压
    decompressed_data = zlib.decompress(compressed_data)
    
    # 将解压缩后的字节串转换回字符串
    decompressed_text = decompressed_data.decode('utf-8')
    
    # 打印原字符串和解压缩后的字符串进行对比
    print("Original Text:", text)
    print("Decompressed Text:", decompressed_text)
    
    # 可选:打印压缩前后数据的长度比较
    print("Original Size:", len(data), "bytes")
    print("Compressed Size:", len(compressed_data), "bytes")
    

    在这里插入图片描述
    很简单转成字节串就行了。大家看压缩前后对比,内容不变,但是数据长度变了。这是正常现象,因为原本的字符串本身长度就不长,转个压缩对象反而增加了对象信息之类的开销。当你压缩的内容越长,受益越大。

gzip

gzip模块提供了对gzip格式压缩文件的支持,gzip是一种流行的文件压缩格式,广泛应用于文件传输和存储,特别是在Unix/Linux系统中。gzip格式基于DEFLATE压缩算法,该算法结合了LZ77压缩方法和霍夫曼编码。

import gzip

with open('original_file.txt', 'rb') as f_in:
    with gzip.open('compressed_file.gz', 'wb') as f_out:
        f_out.writelines(f_in)

在这里插入图片描述
代码很简单。
第一行:打开一个文件,读取二进制流模式。之前讲的rbopen文件打开模式的参数不会忘了吧。
第二行:用gzip模块的open函数打开创建一个.gz文件,写入二进制流模式。
第三行:压缩文件读取原文件的二进制流。
这样就可以看到,文件已经被压缩好了,那么接下来我们解压一下。

with gzip.open('compressed_file.gz', 'rb') as f_in:
    with open('decompressed_file.txt', 'wb') as f_out:
        f_out.writelines(f_in)

在这里插入图片描述
代码一样的简单。
第一行:打开压缩文件,读取二进制流模式。
第二行:打开创建一个txt文件,写入二进制流模式。
第三行:二进制流的写入

最后我们看一下文件内容是不是一样

在这里插入图片描述

事实也证明了,我们使用gzip模块对文件进行压缩和解压,不会改变文件内容。

bz2

bz2模块提供了对BZ2文件格式的支持,这是一种使用Burrows-Wheeler变换和Huffman编码的高压缩比数据压缩算法。BZ2格式通常比传统的gzip格式提供更高的压缩比,尽管它的压缩和解压缩速度可能较慢。bz2模块主要用于需要高压缩率的场合,如存储大量数据或在网络上传输数据时减少带宽消耗。

import bz2

# 待压缩的字符串
text = '这是一个用于演示bz2模块的长文本字符串...'

# 转换为字节串
data = text.encode('utf-8')

# 压缩数据
compressed_data = bz2.compress(data)

# 解压缩数据
decompressed_data = bz2.decompress(compressed_data)

# 将解压缩后的字节串转换回字符串
decompressed_text = decompressed_data.decode('utf-8')

print('压缩前:', text)
print('压缩后:', compressed_data)
print('解压缩后:', decompressed_text)

在这里插入图片描述
看代码就知道,compresse函数仍然接受字节串类型的参数。

最后,我们操作一下文件试试。

# 写入BZ2文件
with bz2.BZ2File('example.bz2', 'wb') as f:
    f.write(text.encode('utf-8'))

# 读取BZ2文件
with bz2.BZ2File('example.bz2', 'rb') as f:
    content = f.read().decode('utf-8')

在这里插入图片描述

也能看到,我们将text的内容存到bz2文件后,读取出的内容与text的内容仍然是一致的。

lzma

lzma模块提供了对LZMA(Lempel-Ziv-Markov Chain Algorithm)压缩算法的支持,这是一种高效的压缩算法,以其高压缩比和相对较快的解压速度而著称。LZMA算法是7-Zip归档工具的核心部分,常用于创建.xz格式的压缩文件。

import lzma

# 写入.xz文件
with lzma.open('example.xz', 'w') as f:
    f.write(b'This is some example text to compress.')

# 读取.xz文件
with lzma.open('example.xz', 'r') as f:
    content = f.read()
print(content.decode('utf-8'))

在这里插入图片描述
这就是压缩和解压缩的例子。可以看到在文件流操作的时候,仍然使用了带b前缀的字符串(其实就是字节串)。这是不是说明和之前三个模块的是一样的,就没多写了。

结尾

以上就是关于数据压缩的四个模块的压缩和解压的功能。不难并且几个模块基础使用方式其实很相似。

当然这几个模块会有更高级特性和用法,这个依旧是用到的时候再仔细学习。基础的压缩和解压缩已经够用了。

作业

  1. 四个模块分别进行压缩和解压缩练习。

ps:今天工作的时候复制swagger链接,中文全部被转成了符号+数字的组合。复制出来以后用urllib.parse又转回去了。然后复制的链接瞬间好看多了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/750319.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

活动|华院计算受邀参加2024全球人工智能技术大会(GAITC),探讨法律大模型如何赋能社会治理

6月22至23日,备受瞩目的2024全球人工智能技术大会(GAITC)在杭州市余杭区未来科技城隆重举行。本届大会以“交叉、融合、相生、共赢”为主题,集“会、展、赛”为一体,聚“产、学、研”于一堂。值得一提的是,…

如何在线上快速定位bug(干货)

想必有许多人都想我刚进公司一样不会快速定位线上bug吧,不会快速定位bug会大大降低我们的开发效率,随之而来的就是工作质量下降、业绩下滑。 我总结了一些我常用的线上定位技巧,希望能帮助到大家! 我这里以使用阿里云日志分析作…

【电路笔记】-MOSFET放大器

MOSFET放大器 文章目录 MOSFET放大器1、概述2、电路图3、电气特性3.1 ** I D = F ( V G S ) I_D=F(V_{GS}) ID​=F(VGS​)**特性3.2 I D = F ( V D S ) I_D=F(V_{DS}) ID​=F(VDS​)特性4、MOSFET放大器5、输入和输出电压6、电压增益7、总结1、概述 在前面的文章中,我们已经…

ThreadLocal 源码浅析

前言 多线程在访问同一个共享变量时很可能会出现并发问题,特别是在多线程对共享变量进行写入时,那么除了加锁还有其他方法避免并发问题吗?本文将详细讲解 ThreadLocal 的使用及其源码。 一、什么是 ThreadLocal? ThreadLocal 是 …

多电商账户为什么要用指纹浏览器?

随着电子商务的蓬勃发展,越来越多的商家选择开设多店来扩大经营规模。然而多店运营也带来了一系列的挑战,其中之一就是账号安全。 1. 了解反检测浏览器和代理服务器 在我们开始讨论如何有效地使用反检测浏览器之前,我们首先需要了解这两个工…

第三十四篇——幸存者偏差:如何避免被已知信息误导?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 人类顶层智慧的总结,一定会让我们在做事的过程中产生降维打击…

测试用例设计方法-流程分析法

一、引言 在软件开发过程中,测试是确保软件质量的关键环节之一。而测试用例设计作为测试过程中的重要组成部分,其质量和完备性直接影响到测试效果和软件的最终交付质量。 测试用例设计的目标是通过设计一组有效的测试用例来检查软件系统的各种功能和行为…

正点原子rk3588烧录linux和安卓镜像

1、烧录 Linux buildroot 系统镜像 1.1 进入 Loader 模式: 按住开发板上的 V(音量)按键不松,给开发板 上电或复位,此时烧录工具会提示:发现一个 LOADER 设备,表示开发板此时已经处于 Loader 模…

华为昇腾310B1芯片DVPP模块VENC视频编码接口调用流程以及视频编码代码梳理

目录 1 接口调用流程 2 代码流程梳理 1 接口调用流程 在CANN 8.0.RC1 AscendCL应用软件开发指南 (C&C, 推理) 01.pdf 文档中有接口调用流程 2 代码流程梳理 代码在samples: CANN Samples - Gitee.com 然后我把这个代码完整的看了一遍,然后梳理了详细的代码…

Transformers 安装及 google-t5/t5-small 机器翻译示例

文章目录 Github文档推荐文章简介安装官方示例google-t5/t5-small使用脚本进行训练Pytorch 机器翻译数据集下载数据集格式转换 Github https://github.com/huggingface/transformers 文档 https://huggingface.co/docs/transformers/indexhttps://github.com/huggingface/tr…

第一后裔The First Descendant开服时间、配置要求一览

第一后裔是一款采用虚幻5引擎打造的第三人称合作射击动作RPG,玩家将化身为一名继承者,通过各种任务和故事不断成长,为守护人类与对抗侵略者战斗。该作即将上线,为了不让玩家们错过这款精彩的游戏,本文整理了第一后裔上…

今天不看文章,明天变垃圾(明天收费)-----字节数据分析发展过程中所遭遇的挑战

字节数据分析发展过程中所遭遇的挑战 三个核心议题: 海量数据分析性能:会议指出Spark分析性能不足成为了一个显著问题,尤其是在需要毫秒级响应的业务场景中。实时导入与查询能力:目前Kylin只能以T1的形式提供分析服务&#xff0…

第十节 动态面板实现推动和拉动效果

在原型设计中我们经常会遇到元件使用显示更多或者收起效果,下面以面板元件推动与拉动效果做案件说明。 一、设置原有内容 我这里添加一个表格内容,添加“显示更多”文本超链接 二、设置在更多显示面板内容 添加一个动态面板,设置有内容、无内容两个状态 在有内容面板中添…

秋招突击——6/26~6/27——复习{二维背包问题——宠物小精灵之收服}——新作{串联所有单词的字串}

文章目录 引言复习二维背包问题——宠物小精灵之收服个人实现重大问题 滚动数组优化实现 新作串联所有单词的字串个人实现参考实现 总结 引言 今天应该是舟车劳顿的一天,头一次在机场刷题,不学习新的东西了,就复习一些之前学习的算法了。 复…

Java程序员接单的十条“野路子”,分分钟收入20K!

Java程序员除了主业工作外,也要适当扩展兼职接单这条路。毕竟Java接单可以说是Java程序员进行技术变现的最佳方式之一。 因为Java程序员兼职接单的难度相对更低,单量也比较可观,最重要的是性价比也很顶,且听我一一道来&#xff1a…

Linux0.12内核源码解读(5)-head.s

大家好,我是呼噜噜,好久没有更新old linux了,本文接着上一篇文章图解CPU的实模式与保护模式,继续向着操作系统内核的世界前进,一起来看看heads.s as86 与GNU as 首先我们得了解一个事实,在Linux0.12内核源…

20240628 每日AI必读资讯

📚 Hugging Face 推出新版开源大模型排行榜,中国模型 Qwen-72B 夺冠 - 阿里Qwen-2-72B指令微调版本问鼎全球开源大模型排行榜榜首 - Llama-3-70B 微调版本排名第二,而 Mixtral-8x22B 微调版本位居第四。 - 另外,微软的 Phi-3-M…

卸载vmware时2503,2502报错的解决办法

1.背景 windows 卸载vmware时,显示2503报错,无法完全卸载 2. 解决方案 2.1 参考安装报错2502,2503的处理方式 文献:https://blog.csdn.net/zhangvalue/article/details/80309828 2.1 步骤: 2.1.1 cmd 管理员打开…

字节码编程ASM之插桩方法执行耗时

写在前面 本文看下如何对已有类进行插装。以最经典的方法执行耗时作为例子。 1:编码 假定有如下的代码: public class MyMethod {public String queryUserInfo(String uid) {System.out.println("xxxx");System.out.println("xxxx1&q…

可的哥Codigger项目体检是衡量代码质量标准

在飞速发展的现代商业世界中,项目能否成功的核心要素是项目质量,也就是其健康状态。为了确保项目顺利进行并达到预期目标,项目体检工具(Health Check),简称“项目体检”,变得尤为重要。可的哥&a…