struct.unpack和struct.pack打包、解包图像和npy类型文件

本文详细介绍了如何使用struct模块对图片和npy文件进行打包(struct.pack)以及如何解包(struct.unpack),以提升文件处理速度,同时提供了示例代码和步骤,展示了如何将文件夹中的图片和npy文件合并为大文件,以及如何还原这些文件。

一、简介

        网上未见关于struct.unpack和struct.pack对图片或者npy类型文件打包解包的教程,故搜集资料钻研一下关于这方面的用法。

        有些情况下,直接对文件夹中的大量图像等文件进行处理,可能会影响程序执行的速度。这时,如果能够先将图像等文件打包合并为一个(二进制bytes流)文件,从内存中读取bytes,一定程度上能够提高读取的速度。

        本文中对各种图片类型文件和numpy生成的存储矩阵的npy类型文件进行打包。

        我的文件目录如下安排:

test
   |--image
         |--1.jpg
         |--2.jpg
         |--...
   |--npy
         |--2887.npy
         |--2888.npy
         |--...
   |--bigdata   #存放打包后的大文件。如image.bigfile
   |--out1      #将打包后的大文件还原,此处还原结果和image文件夹内容一致
   |--out2      #将打包后的大文件还原,此处还原结果和npy文件夹内容一致
   pack.py
   unpack.py

二、打包struct.pack

打包文件夹中的文件:(如图片类型、npy类型)

如下为pack.py文件内容:

import os
import struct


# 判断文件夹中是否有目标类型图片,没有则返回0
def is_image_file(filename):
    # 如果不都为空、0、false,则any()返回true
    return any(filename.endswith(e
### struct.pack struct.unpack 的使用方法及区别 `struct.pack` `struct.unpack` 是 Python `struct` 模块中的两个核心函数,它们分别用于将 Python 数据类型与二进制数据之间进行转换。两者之间的功能是互逆的,适用于底层数据处理、网络通信文件格式解析等场景。 #### struct.pack 的使用方法 `struct.pack(fmt, v1, v2, ...)` 函数用于将给定的变量按照指定的格式 `fmt` 打包成二进制数据(字节串)。格式字符串 `fmt` 包含格式字符可选的字节顺序、大小对齐方式的标识符。例如,`'h'` 表示短整型(2字节),`'i'` 表示整型(4字节),`'B'` 表示无符号字节(1字节)等。格式字符串前可以包含一个字节顺序标识符,如 `'>'` 表示大端模式,`'<'` 表示小端模式。 示例代码如下: ```python import struct # 使用大端模式打包两个整数两个字节 data = struct.pack(">iiBB", 20, 400, 0x0D, 0x0A) print(data) # 输出: b'\x00\x00\x00\x14\x00\x00\x01\x90\r\n' ``` #### struct.unpack 的使用方法 `struct.unpack(fmt, string)` 函数用于将二进制数据按照指定的格式 `fmt` 解包Python 数据类型。该函数返回一个元组,其中包含解包后的数据。格式字符串 `fmt` 必须与打包时使用的格式一致,否则可能导致解包错误或数据不一致。 示例代码如下: ```python import struct # 解包之前打包的数据 unpacked_data = struct.unpack(">iiBB", data) print(unpacked_data) # 输出: (20, 400, 13, 10) ``` #### struct.pack struct.unpack 的区别 `struct.pack` `struct.unpack` 的主要区别在于它们的功能方向不同。`struct.pack` 将 Python 数据转换为二进制数据,而 `struct.unpack` 则将二进制数据还原为 Python 数据。它们通常用于处理需要精确控制字节顺序大小的场景,例如网络协议数据的编码解码。 此外,`struct.pack` `struct.unpack` 与字符串的 `encode` `decode` 方法不同。后者用于在文本数据字节流之间进行转换,而前者用于在二进制数据 Python 数据类型之间进行转换。这种区别使得 `struct` 模块更适合处理结构化的二进制数据,如 C 语言中的结构体。 #### 格式字符串的规则 格式字符串由格式字符、数量前缀字节顺序标识符组成。格式字符定义了数据类型,如 `'i'` 表示整型,`'s'` 表示字符串,`'B'` 表示无符号字节等。数量前缀表示重复的次数,例如 `'4s'` 表示长度为 4 的字符串。字节顺序标识符定义了数据的存储方式,如 `'>'` 表示大端模式,`'<'` 表示小端模式。 #### 注意事项 - 格式字符串中的每个格式字符对应一个数据项,数据项的数量必须与格式字符串中定义的数量一致。 - 如果格式字符串中包含字符串类型(如 `'s'`),则需要确保字符串的长度与格式字符串中指定的长度一致。 - `struct.pack` `struct.unpack` 支持的数据类型有限,主要适用于数值类型固定长度的字符串。 - 字节顺序标识符可以改变数据的存储方式,但默认情况下,`struct` 模块根据本地机器的字节顺序进行转换。 --- ### 示例代码 ```python import struct # 打包数据 data = struct.pack(">iiBB", 20, 400, 0x0D, 0x0A) print(data) # 输出: b'\x00\x00\x00\x14\x00\x00\x01\x90\r\n' # 解包数据 unpacked_data = struct.unpack(">iiBB", data) print(unpacked_data) # 输出: (20, 400, 13, 10) ``` --- ### 相关问题 1. 如何使用 struct 模块处理 C 语言结构体? 2. 如何在 Python 中使用 struct 模块解析网络协议数据? 3. struct.pack struct.unpack 如何处理浮点数? 4. 如何使用 struct 模块处理变长字符串?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alocus_

如果我的内容帮助到你,打赏我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值