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

news2024/9/9 4:02:03

前言

本文是根据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.coloradmin.cn/o/1870636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言的内存知识

这节我们主要认识一下内存,便于理解指针操作和后续内存管理。 一、内存分区模型 C程序在执行时,将内存大方向划分为4个区域 (可以结合函数小节的函数栈帧部分看一下) ⚪ 代码区:存放函数体的二进制代码,由操作系统进…

wgcloud怎么保证数据的安全性

WGCLOUD做了以下方面来保证数据安全 1、私有化部署 WGCLOUD是完全本地部署,没有云端服务,因此不用担心数据被他人获取 2、加密传输数据 WGCLOUD支持https传输数据,查看配置说明,实现使用SSL证书https访问server页面 - WGCLOUD…

第一后裔/The First Descendant延迟高的解决方法

第一后裔/The First Descendant是一款备受玩家关注的射击游戏,该作拥有多个角色,并为其设定不同的概念和战斗风格,以及技能点,不仅能让玩家畅快作战,还能通过各种道具,不断强化角色能力值,让其战…

Python 基础:使用 unittest 模块进行代码测试

目录 一、测试函数2.1 通过案例2.2 不通过案例2.3 添加新测试 二、测试类2.1 单个测试案例2.2 多个测试案例 三、总结 遇到看不明白的地方,欢迎在评论中留言呐,一起讨论,一起进步! 本文参考:《Python编程:…

Jenkins教程-9-发送企业微信测试报告通知

上一小节我们学习了Jenkins上下游关联自动化测试任务的构建的方法,本小节我们讲解一下发送企业微信测试报告通知的方法。 1、自动化用例执行完后,使用pytest_terminal_summary钩子函数收集测试结果,存入本地status.txt文件中,供J…

Arathi Basin (AB) PVP15

Arathi Basin (AB) PVP15 阿拉希盆地,PVP,15人战场

【银河麒麟】高可用触发服务器异常重启,处理机制详解

1.服务器环境以及配置 【机型】物理机 处理器: Intel 内存: 126G 【内核版本】 4.19.90-25.16.v2101.ky10.x86_64 【银河麒麟操作系统镜像版本】 Kylin-Server-10-SP2-Release-Shenzhen-Metro-x86-Build01-20220619 Kylin-HA-10-SP2-Release-S…

前端vue3 根据某些Id 筛选数据

现在有一些不等的数据 我需要通过前端 吧这个数据筛选一下 比如我使用一些 我需要的ID 下的数据 比如以上的数据 的 cinemaLineId 来筛选 const cinemaLineId ref(["1246429254713147392", "1182608813770321920", "1182608917403185152"])…

大数据之Hadoop部署

文章目录 服务器规划服务器环境准备1. 网络测试2. 安装额外软件包3. 安装基础工具4. 关闭防火墙5. 创建用户并配置权限6. 创建目录并设置权限7. 卸载JDK8. 修改主机名9. 配置hosts文件10. 重启服务器 配置免密登录安装Java安装Hadoop1. Hadoop部署2. 配置Hadoop3. 格式化Hadoop…

【PyQt5】一文向您详细介绍 QVBoxLayout() 的作用

【PyQt5】一文向您详细介绍 QVBoxLayout() 的作用 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的普通本硕&a…

机器人控制系列教程之URDF文件语法介绍

前两期推文:机器人控制系列教程之动力学建模(1)、机器人控制系列教程之动力学建模(2),我们主要从数学的角度介绍了机器人的动力学建模的方式,随着机器人技术的不断发展,机器人建模成为了机器人系统设计中的一项关键任务。URDF&…

我只有一点Python基础,对学习WebGIS开发有帮助吗?

经常有人后台私信问,我只有一点Python基础,对学习GIS开发有帮助吗? 关于这个问题的答案是,当然有!Python适用于WebGIS开发。WebGIS是地理信息系统(GIS)技术与Web技术的结合,而Pytho…

Go语言学习:每日一练2

Go语言学习:每日一练2 目录 Go语言学习:每日一练2结构体零值数组切片映射指针 各个类型的零值一览 结构体 //定义 type Vertex struct {X, Y int } //使用 func main() { v1 : Vertex{1, 2} fmt.Println(v.X) //别的实例化方式 var v2 Vertex v2 : *new…

《PIDNet: A Real-time Semantic Segmentation Network Inspired by PID Controllers》

期刊:CVPR 年份:2023 代码:https://github.com/XuJiacong/PIDNet 摘要 双分支网络架构已经证明了它在实时语义分割任务中的有效性和有效性。然而,高分辨率细节和低频上下文的直接融合的缺点是细节特征很容易被周围的上下文信息…

Nuxt3 的生命周期和钩子函数(三)

title: Nuxt3 的生命周期和钩子函数(三) date: 2024/6/27 updated: 2024/6/27 author: cmdragon excerpt: 摘要:概述了Nuxt3的关键生命周期钩子用途,如page:finish用于页面加载后处理,page:transition:finish处理过…

MySQL数据库简介和安装

文章目录 一、数据库原理目前情况数据库的发展史RDBMS关系型数据库关系型数据库理论 二、MySQL历史发展历程关系型数据库和非关系型数据库 三、安装mysql及优化yum安装编译安装mysql二进制安装优化操作 四、 安装mycli插件客户端工具 一、数据库原理 目前情况 我们正处于一个…

十三、Maven(1)

🌻🌻目录 一、maven价绍二、maven的功能1、项目自动化构建2、管理jar、war包3、实现项目结构设计 三、maven安装1、maven的安装环境需要jdk2、Maven的安装路径中不能出现中文和空格3、压缩包解压即可4、配置环境变量 四、maven的仓库1. Maven仓库配置2. …

AI提示词投喂新手教程(一):基础概念和工具

对于很多已经熟悉提示词工程(prompt engineering)的朋友来说,以下内容可能已经是老生常谈了。然而,仔细搜索和翻阅了星球上关于提示词的新手教程,发现对新手并不是很友好,内容零散且缺乏系统性。为此&#…

Construct公司 从 0 到 1 基于 Kitex+Istio 的微服务系统建设

本文根据 2024 年 5 月 25 日在上海举办的“云原生✖️AI 时代的微服务架构与技术实践”CloudWeGo 技术沙龙上海站活动中,Construct 服务端总监 Jason 的演讲《从 0 到 1 基于 Kitex Istio 的微服务系统建设》整理而来。 在微服务架构的浪潮中,企业面临…

Android 通知组

一. 通知组简介 从 Android 7.0(API 级别 24)开始,您可以在一个组中显示相关通知。如下所示: 图 1. 收起(顶部)和展开(底部)的通知组。 注意 :如果应用发出 4 条或更多条通知且未…