一文学会Python标准库struct序列化与反序列化

使用Python标准库struct序列化Python整数、实数、字节串时,需要使用struct模块的pack()函数把对象按指定的格式进行序列化,然后使用文件对象的write()方法将序列化的结果字节串写入以'wb'或'ab'模式打开的二进制文件。读取时需要使用文件对象的read()方法从以'rb'模式打开的二进制文件中读取指定数量的字节串,然后再使用struct模块的unpack()函数反序列化得到原来对象息。如果需要的话,可以使用calcsize()函数计算指定类型序列化时所需要的字节数量。标准库struct中常用的函数及功能下表所示。

表  标准库struct中的常用函数

函数

功能简介

calcsize(format, /)

计算并返回序列化format格式的数据需要的字节数量,例如struct.calcsize('i')的值为4,表示序列化整数需要4个字节,也就是说整数的序列化有限制,不能序列化任意大的Python整数

pack(format, v1, v2, ...)

使用参数format指定的格式对v1、v2等若干值进行序列化,返回序列化后的字节串

unpack(format, buffer, /)

使用参数format指定的格式对参数buffer指定的字节串进行反序列化,返回包含若干值的元组

struct模块支持多种类型的数据序列化,表9-3中函数参数format可取的值如下表所示。这些格式可以组合使用,对多个数据同时序列化,例如struct.pack('ii', 345, 123)表示把两个整数345和123序列化为一个字节串,结果为b'Y\x01\x00\x00{\x00\x00\x00'。

另外,format可以使用第一个字符来指定序列化时使用的字节顺序、长度和对齐方式,不指定时默认值@会根据需要自动进行字节填充和对齐。例如,struct.pack('i?', 3, True)的值为b'\x03\x00\x00\x00\x01',长度为5个字节,而struct.pack('?i', True, 3)的值为b'\x01\x00\x00\x00\x03\x00\x00\x00',长度为8个字节。可以设置format第一个字符为<、>或=,这时不会自动进行字节填充和对齐,要注意的是pack()函数的format参数和对应的unpack()函数的format参数使用的字节顺序和对齐方式要一致。

表  struct支持的格式

格式字符

对应的C语言类型

对应的Python类型

使用的字节数量

c

char

长度为 1 的字节串

1

b

signed char

整数

1

B

unsigned char

整数

1

?

_Bool

布尔值True/False

1

h

short

整数

2

H

unsigned short

整数

2

i

int

整数

4

I

unsigned int

整数

4

l

long

整数

4

L

unsigned long

整数

4

q

long long

整数

8

Q

unsigned long long

整数

8

n

ssize_t

整数

8

N

size_t

整数

8

f

float

浮点数

4

d

double

浮点数

8

s

char[]

字节串

1

p

char[]

字节串

1

P

void *

整数

8

  编写程序,对若干不同的值进行序列化并写入二进制文件,然后读取这个二进制文件中的数据进行还原。

解析:程序中的格式字符串'if?i56si64si64s'对应1个整数、1个实数、1个bool值、1个整数(表示后面紧邻的56个字节中有效字节的数量)、1个字节串(实际长度为56个字节,其中只有前面一部分是有效字节,后面是填充符)、1个整数(表示后面紧邻的64个字节中有效字节的数量)、1个字节串(实际长度为64个字节,其中只有前面一部分是有效字节,后面是填充符)、1个整数(表示后面紧邻的64个字节中有效字节的数量)、1个字节串(实际长度为64个字节,其中只有前面一部分是有效字节,后面是填充符)进行序列化。通过内置函数str()可以把任意Python对象转换为字符串然后再使用encode()方法转换为字节串最后使用struct进行序列化,在网络编程使用socket传输数据时经常用到struct序列化和反序列化。

一文学会Python标准库struct序列化与反序列化

 

运行结果:

一文学会Python标准库struct序列化与反序列化

 

 

 

温馨提示

关注本公众号“Python小屋”,通过菜单“最新资源”==>“历史文章”可以快速查看分专题的930篇技术文章列表(可根据关键字在页面上搜索感兴趣的文章),通过“最新资源”==>“微课专区”可以免费观看450节Python微课,通过“最新资源”==>“培训动态”可以查看近期Python培训安排,通过“最新资源”==>“教学资源”可以查看Python教学资源。

一文学会Python标准库struct序列化与反序列化

---董付国老师Python系列图书---

友情提示:不建议购买太多,最好先通过京东、当当、天猫查阅图书了解目录和侧重点,然后再选择购买适合自己的书。

(1)《Python程序设计(第2版)》(ISBN:978-7-302-43651-5),清华大学出版社,2016年8月出版,2019年度清华大学出版社畅销图书

(2)《Python可以这样学》(ISBN:978-7-302-45646-9),清华大学出版社,2017年2月

(3)《Python程序设计基础(第2版)》(ISBN:978-7-302-49056-2)清华大学出版社,2018年1月出版,2019年度清华大学出版社畅销图书

(4)《中学生可以这样学Python》(ISBN:978-7-302-48039-6)清华大学出版社,配套微课:《中学生可以这样学Python》84节微课免费观看地址

(5)《Python程序设计开发宝典》(ISBN:978-7-302-47210-0)清华大学出版社,2018年10月

(6)《玩转Python轻松过二级》(ISBN:978-7-302-49916-9)清华大学出版社,2018年5月

(7)《Python程序设计基础与应用》(ISBN:978-7-111-60617-8),机械工业出版社,2018年9月

(8)《Python程序设计实验指导书》(ISBN:9787302525790),清华大学出版社,2019年4月

(9)《Python编程基础与案例集锦(中学版)》(ISBN:978-7-121-35539-4),电子工业出版社,2019年4月

(10)《大数据的Python基础》(ISBN:978-7-111-62455-4),机械工业出版社,预计2019年5月出版

(11)译作《Python程序设计》,机械工业出版社(华章),2018年11月出版

(12)繁体版《Python也可以这样学》,台湾博硕文化股份有限公司,2017年10月出版,本书为《Python可以这样学》在台湾发行的繁体版,两本书内容一样,不建议重复购买。

(13)《Python程序设计实例教程》(ISBN:978-7-111-63198-9),机械工业出版社

(14)《Python数据分析、挖掘与可视化》(ISBN:978-7-115-52361-7),人民邮电出版社,2019年12月