存储打包的二进制数据:struct 模块 | 第二部分 类型与操作 —— 第 9 章: 元组,文件和其他 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-大发黄金版app下载
在继续前进前一个其它文件相关的说明:一些高级应用程序也需要处理打包的二进制数据(可能被c语言程序或网络连接创建)。python的标准库包含本领域的一个工具来提供帮助——struct
模块知道如何组合和解析打包好的二进制数据。在某种意义上,这是另一种将文件中的字符串解释为二进制数据的数据转换工具。
在第4章已经大致了解了本工具,但这里再快速看一下来更全面的了解。为了创建一个打包好的二进制数据文件,以 'wb'(write binary)的模式打开它,然后给struct
传入一个格式字符串和一些python对象。这里使用的格式字符串 >i4sh
意味着打包为一个4字节整数,一个4字节字符串(从python 3.2开始必须是一个 bytes
字符串),和一个二字节整数,全部都以 big-endian
形式(其它的格式代码处理填充字节,浮点数等等):
>>> f = open('data.bin', 'wb') # open binary output file
>>> import struct
>>> data = struct.pack('>i4sh', 7, b'spam', 8) # make packed binary data
>>> data
b'\x00\x00\x00\x07spam\x00\x08'
>>> f.write(data) # write byte string
>>> f.close()
python 创建了二进制 bytes
数据字符串,我们通常将其写入文件——此文件包含了大多数不可打印的字符(以16进制转义符打印),且是之前碰到的同样的二进制文件。要把这些值解析为普通的python对象,简单地读取字符串并使用同样的格式字符串将其解包。python将这些值提取为普通的python对象——整数和字符串:
>>> f = open('data.bin', 'rb')
>>> data = f.read() # get packed binary data
>>> data
b'\x00\x00\x00\x07spam\x00\x08'
>>> values = struct.unpack('>i4sh', data) # convert to python objects
>>> values
(7, b'spam', 8)
二进制文件是高级的而且有点底层化的工具,我们将不会在这里详述;要获取更多帮助,参见第37章中的struct
讲解,查询python库手册,或交互地导入struct
然后将其传递给help
函数。还要注意可以使用二进制文件处理模式 'wb' 和 'rb' 来处理更简单的二进制文件,如图片或音频文件,总的来说不需要解包其内容;在这种情况下,你的代码可能将其未经解析地传递给其它文件或工具。