【问题标题】:python struct unpack into a dictpython struct 解压成字典
【发布时间】:2011-11-01 14:19:48
【问题描述】:

struct.unpack 将数据解包到一个元组中。是否有将数据存储到字典中的等价物?

在我的特定问题中,我正在处理固定宽度的二进制格式。我希望能够一举将值解包并存储在 dict 中(目前我手动遍历列表并分配 dict 值)

【问题讨论】:

  • 我不这么认为。但是dict 构造函数可以使用 (name, value) 对的列表或迭代器进行初始化。这可能会对你有所帮助。
  • 如果您在创建对象后不需要修改对象,您可能还对namedtuple 感兴趣。
  • 您希望密钥是什么?

标签: python unpack


【解决方案1】:

如果您使用的是 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

【讨论】:

    【解决方案2】:

    你想要这样的东西吗?

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

    【讨论】:

    • 这就是我现在正在做的事情。我希望有一些更光滑的东西
    • 它是一个正在遍历的列表(除非 zip 做了一些不涉及遍历列表的巧妙操作)。
    • 我觉得这个解决方案很好,而且已经比在 collections.namedtuple 上胡闹要灵活了
    • 顺便说一句,这个方法比命名元组版本快很多
    【解决方案3】:

    struct 文档显示 an example 直接解压缩到 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...

    【讨论】:

    • 嘿,可能应该检查一下网络文档。在 python help(struct) 中没有这方面的迹象
    • 有趣的答案。我看到它是一个动态生成的函数,但为什么 _asdict() 带有前置下划线?
    • @FogleBird - 不确定您所说的私有方法是什么意思。 namedtuple._asdict() 记录在这里:python.org/doc//current/library/…。我直接从答案中链接的文档中使用了namedtuple._make()。这里推荐的最佳做法是什么?
    • 第五行可以更简洁的改写为Student(*struct.unpack('&lt;10sHHb', record))._asdict()
    • 这个解决方案明显比dict(zip(keys,struct.unpack(...)))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 2021-11-15
    • 2020-10-06
    • 1970-01-01
    • 2018-11-03
    相关资源
    最近更新 更多