存储打包的二进制数据:struct 模块

未匹配的标注

在继续前进前一个其它文件相关的说明:一些高级应用程序也需要处理打包的二进制数据(可能被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' 来处理更简单的二进制文件,如图片或音频文件,总的来说不需要解包其内容;在这种情况下,你的代码可能将其未经解析地传递给其它文件或工具。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~