Python学习笔记24:进阶篇(十三)常见标准库使用之数据压缩功能模块zlib,gzip,bz2,lzma的学习使用
前言
本文是根据python官方教程中标准库模块的介绍,自己查询资料并整理,编写代码示例做出的学习笔记。
根据模块知识,一次讲解单个或者多个模块的内容。
教程链接:https://docs.python.org/zh-cn/3/tutorial/index.html
数据压缩
很多时候我们可以利用的内存有限,时间有限,资源有限,但是又不得不进行一些大量数据的操作时,我们可以通过压缩的方式灵活高效地处理数据存储和传输问题,优化应用性能。
在Python中,通过特定的算法,将原始数据转换成一个更紧凑的形式,这个过程称为压缩;而将压缩后的数据恢复到原始形式的过程则称为解压缩。这里简单了解一些这些模块后,一个个进行学习使用。
- zlib:
介绍:zlib 模块提供了对 zlib 压缩库的接口,支持 gzip 文件格式的压缩和解压缩。
功能:可以用于数据的简单压缩和解压缩,常用于需要快速压缩速度和相对较高压缩率的场合。
常用函数:compress(), decompress(), crc32() 等。 - gzip:
介绍:gzip 模块允许你使用 gzip 文件格式进行压缩和解压缩操作。
功能:提供了文件对象(如 GzipFile)来处理 .gz 文件,可以透明地读写压缩文件,就像它们是普通文件一样。
常用类:GzipFile 类用于创建或读取 gzip 格式的文件。 - bz2:
介绍:此模块提供了对 bzip2 压缩算法的支持。
功能:相较于 zlib,bzip2 提供了更高的压缩比,但压缩速度较慢。适用于需要高压缩比而时间不是关键因素的场景。
常用类:BZ2File 类用于读写 bzip2 格式的文件。 - lzma:
介绍:lzma 模块提供了对 LZMA (Lempel-Ziv-Markov chain Algorithm) 压缩算法的支持,这是 xz 文件格式的基础。
功能:LZMA 提供了非常高的压缩比,特别适合于大文件的压缩。它在解压速度上也表现良好。
常用类:LZMAFile 类用于读写 xz 格式的文件,以及相关的压缩和解压缩函数。
这些模块使得Python能够方便地处理各种常见的压缩格式,满足不同的数据压缩需求。
zlib
zlib模块是Python的标准库之一,它提供了对zlib压缩库的接口,支持DEFLATE压缩算法,这是一种广泛使用的数据压缩算法,也是gzip、zip等文件格式的基础。zlib模块主要用于需要快速压缩速度和相对较高压缩率的场合,比如网络数据传输、文件存储等。
压缩与解压
import zlibdata = b"This is an example of compressed data."
# 压缩
compressed_data = zlib.compress(data)
# 解压
decompressed_data = zlib.decompress(compressed_data)
print(decompressed_data.decode())
通过输出可以看出,字符串压缩再解压后打印,并没有什么影响。
这里单独要讲2个点。
-
字符串前面的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前缀:这个就不用多讲了,格式化字符串,用来替换字符串中某些特定的值
-
怎么压缩中文?
这个问题其实和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 gzipwith open('original_file.txt', 'rb') as f_in:with gzip.open('compressed_file.gz', 'wb') as f_out:f_out.writelines(f_in)
代码很简单。
第一行:打开一个文件,读取二进制流模式。之前讲的rb
open文件打开模式的参数不会忘了吧。
第二行:用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前缀的字符串(其实就是字节串)。这是不是说明和之前三个模块的是一样的,就没多写了。
结尾
以上就是关于数据压缩的四个模块的压缩和解压的功能。不难并且几个模块基础使用方式其实很相似。
当然这几个模块会有更高级特性和用法,这个依旧是用到的时候再仔细学习。基础的压缩和解压缩已经够用了。
作业
- 四个模块分别进行压缩和解压缩练习。
ps:今天工作的时候复制swagger链接,中文全部被转成了符号+数字的组合。复制出来以后用urllib.parse又转回去了。然后复制的链接瞬间好看多了!
相关文章:

Python学习笔记24:进阶篇(十三)常见标准库使用之数据压缩功能模块zlib,gzip,bz2,lzma的学习使用
前言 本文是根据python官方教程中标准库模块的介绍,自己查询资料并整理,编写代码示例做出的学习笔记。 根据模块知识,一次讲解单个或者多个模块的内容。 教程链接:https://docs.python.org/zh-cn/3/tutorial/index.html 数据压缩…...
【笔记】Android Settings 应用设置菜单的界面代码介绍
简介 Settings应用中,提供多类设置菜单入口,每个菜单内又有各模块功能的实现。 那么各个模块基于Settings 基础的界面Fragment去实现UI,层层按不同业务进行封装继承实现子类: DashboardFragmentSettingsPreferenceFragment 功…...
Symfony配置管理深度解析:构建可维护项目的秘诀
Symfony是一个高度灵活且功能丰富的PHP框架,它提供了一套强大的配置管理系统,使得开发者能够轻松定制和优化应用程序的行为。本文将深入探讨Symfony中的配置管理机制,包括配置的结构、来源、加载过程以及最佳实践。 一、配置管理的重要性 在…...

视频的宣传片二维码怎么做?扫码播放视频的制作教程
现在很多的宣传片会通过扫码的方式来展示,通过将视频生成二维码之后,其他人就可以扫码来查看视频内容,从而简化获取视频的过程,提升视频传播的效率及用户查看视频的便捷性。目前,日常生活和工作中就有视频二维码的应用…...
实用的网站
前端 精简CSS格式 Font Awesome 图标库 BootCDN 加速服务 LOGO U钙网 AI AI工具集 视频下载 B站视频解析下载...

Monorepo(单体仓库)与 MultiRepo(多仓库): Monorepo 单体仓库开发策略与实践指南
🔥 个人主页:空白诗 文章目录 一、引言1. Monorepo 和 MultiRepo 简介2. 为什么选择 Monorepo? 二、Monorepo 和 MultiRepo 的区别1. 定义和概述2. 各自的优点和缺点3. 适用场景 三、Monorepo 的开发策略1. 版本控制2. 依赖管理3. 构建和发布…...

使用 PyTorch 创建的多步时间序列预测的 Encoder-Decoder 模型
Encoder-decoder 模型在序列到序列的自然语言处理任务(如语言翻译等)中提供了最先进的结果。多步时间序列预测也可以被视为一个 seq2seq 任务,可以使用 encoder-decoder 模型来处理。本文提供了一个用于解决 Kaggle 时间序列预测任务的 encod…...
开启IT世界的第一步:高考新生的暑期学习指南
目录 前言 了解IT领域 学习编程语言 实践项目 学习资源 阅读专业书籍 培养良好的学习习惯 结语 最后 - 投票 前言 七月的钟声敲响,各省的高考分数已揭晓,意味着一段紧张而又充满奋斗的旅程画上了句号。然而,高考的结束并不意味…...

软考系统架构师高效备考方法论
软考系统架构师高效备考方法论 本章总结的备考方法论也是希望能帮助更多的小伙伴高效的备考最终通过考试,这种考试个人感觉是尽量一次性考过, 要不然老拖着,虽然每年可以考两次,5月和11月,两次考试间隔5个月时间&#…...

【neo4j图数据库】入门实践篇
探索数据之间的奥秘:Neo4j图数据库引领新纪元 在数字化浪潮汹涌的今天,数据已成为企业最宝贵的资产之一。然而,随着数据量的爆炸性增长和数据关系的日益复杂,传统的关系型数据库在处理诸如社交网络、推荐系统、生物信息学等高度互…...

【TS】TypeScript 原始数据类型深度解析
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 TypeScript 原始数据类型深度解析一、引言二、基础原始数据类型2.1 boolean2.2 …...
怎么样调整分类的阈值
调整分类模型的阈值是改变模型对正负类的预测标准的一种方法,常用于提高精确率、召回率或者其他性能指标。以下是如何调整分类阈值的步骤和方法: PS:阈值是针对预测概率(表示样本属于某个特定类别的可能性)来说的 调…...

java+mysql教师管理系统
完整源码地址 教师信息管理系统使用命令行交互的方式及数据库连接实现教师信息管理系统,该系统旨在实现教师信息的管理,并根据需要进行教师信息展示。该软件的功能有如下功能 (1)基本信息管理(教师号、姓名、性别、出生年月、职称、学历、学位、教师类型…...

PDF文档如何统计字数,统计PDF文档字数的方法有哪些?
在平时使用pdf阅读或者是处理文档的时候,常常需要统计文档的字数。pdf在查看文字时其实很简单。 PDF文档是一种常见的电子文档格式,如果需要对PDF文档中的字数进行统计,可以使用以下方法: Adobe Acrobat DC:Adobe Ac…...
在Python asyncio中如何识别协程是否被block了
现在asyncio在Python中的使用越来越广泛了,但是很多人对于协程(corotine)的一些使用方式还不太熟悉。在这篇文章中,我将会介绍如何识别协程是否被block了,并以常用的HTTP网络库requests/httpx为例来说明如何避免协程被block的问题。 为什么协程会被block 在Python中,可…...

Hyper-V虚拟机固定IP地址(手把手教设置)
链接虚拟机修改网络配置文件 输入指令 sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0 然后 输入 按 i 键 再按回车 (enter) 进入编辑模式 修改配置(这几项)其中 IPADDR 就是你想给虚拟机固定的 IP 地址 多台的话只需要修改这个IP 就行其他不变 BOOTPROTO=static…...

以 Vue 3 项目为例,多个请求下如何全局封装 Loading 的展示与关闭?其中大有学问!
大家好,我是CodeQi! 项目开发中,Loading 的展示与关闭是非常关键的用户体验设计。 当我们的应用需要发起多个异步请求时,如何有效地管理全局 Loading 状态,保证用户在等待数据加载时能有明确的反馈,这是一个值得深入探讨的问题。 本文将以 Vue 3 项目为例,详细讲解如…...

Node.js学习(一)
Node.js安装与入门案例: 需求:点击按钮,请求本地目录指定文件的内容,并显示在页面上 刚入门肯定想着直接写相对路径请求指定路径数据就行了,可是会发现不行。 网页运行在浏览器端,通常后续要发布…...
Spring Data JPA使用及实现原理总结
Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…...

【C语言】extern 关键字
在C语言中,extern关键字用于声明一个变量或函数是定义在另一个文件中的。它使得在多个文件之间共享变量或函数成为可能。extern关键字常见于大型项目中,通常用于声明全局变量或函数,这些变量或函数的定义位于其他文件中。 基本用法 变量声明…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...