将Python struct解包到字典中

7 投票
3 回答
21855 浏览
提问于 2025-04-17 00:09

struct.unpack 可以把数据解包成一个元组。那么有没有类似的方式可以把数据存储到字典里呢?

在我遇到的问题中,我在处理一种固定宽度的二进制格式。我希望能够一次性解包并把值存储到字典里(现在我都是手动遍历列表,然后一个个给字典赋值)。

3 个回答

9

你想要这样的东西吗?

keys = ['x', 'y', 'z']
values = struct.unpack('<III', data)
d = dict(zip(keys, values))
12

如果你使用的是2.6版本或更新的版本,你可以像这样结合使用namedtuple和struct.pack/unpack:

import collections
import struct

Point = collections.namedtuple("Point", "x y z")

data = Point(x=1, y=2, z=3)

packed_data = struct.pack("hhh", *data)
data = Point(*struct.unpack("hhh", packed_data))

print data.x, data.y, data.z
5

struct的文档里有一个例子,展示了如何直接把数据拆分到一个叫做namedtuple的结构里。你可以把这个方法和namedtuple._asdict()结合起来,得到你想要的结果:

>>> import struct
>>> from collections import namedtuple
>>> record = 'raymond   \x32\x12\x08\x01\x08'
>>> Student = namedtuple('Student', 'name serialnum school gradelevel')
>>> Student._asdict(Student._make(struct.unpack('<10sHHb', record)))
{'school': 264, 'gradelevel': 8, 'name': 'raymond   ', 'serialnum': 4658}
>>> 

如果你在意的话,要注意在Python 2.7中,_asdict()会返回一个OrderedDict...

撰写回答