登录
首页 >  文章 >  python教程

msgpack库使用教程及实战详解

时间:2025-12-13 17:57:49 440浏览 收藏

推广推荐
免费电影APP ➜
支持 PC / 移动端,安全直达

“纵有疾风来,人生不言弃”,这句话送给正在学习文章的朋友们,也希望在阅读本文《Python中msgpack库使用方法详解》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新文章相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

msgpack是一种高效的二进制序列化格式,比JSON更小更快,适用于网络通信和缓存存储。通过pip install msgpack安装,使用packb()/unpackb()进行内存中数据的序列化与反序列化,支持dict、list、str、int等基本类型。可使用dump()/load()操作文件对象实现持久化存储。对于datetime等不支持的类型,可通过default和ext_hook参数自定义编码解码逻辑。注意默认情况下字符串key可能被转为bytes,需设置raw=False以保持为str类型。msgpack性能优越,适合在内部系统间高效传输数据。

Python中msgpack库如何使用?

msgpack 是一种高效的二进制序列化格式,比 JSON 更小、更快。Python 中通过 msgpack 库实现对象的打包与解包。它适用于需要高性能数据交换的场景,比如网络通信、缓存存储等。

安装 msgpack

使用 pip 安装 msgpack Python 库:

pip install msgpack

注意:包名是 msgpack,但在代码中导入时写为 msgpack(不是 msgpack-python 或其他变体)。

基本序列化与反序列化

msgpack 支持常见 Python 数据类型:dict、list、str、int、float、bool 和 None。

示例:打包和解包基本数据

import msgpack

# 要序列化的数据
data = {
    'name': 'Alice',
    'age': 30,
    'is_student': False,
    'hobbies': ['reading', 'coding']
}

# 序列化为字节
packed_data = msgpack.packb(data)
print(packed_data) # 输出二进制数据

# 反序列化
unpacked_data = msgpack.unpackb(packed_data)
print(unpacked_data) # 输出原始数据结构

packb() 将对象转为字节串,unpackb() 将字节串还原。

处理文件读写

可以将数据直接写入文件或从文件读取,避免内存中保留完整字节串。

写入文件:

with open('data.msgpack', 'wb') as f:
    msgpack.dump(data, f)

读取文件:

with open('data.msgpack', 'rb') as f:
    loaded_data = msgpack.load(f)

dump() 和 load() 用于文件对象操作,功能类似于 pickle 或 json 模块的对应方法。

处理不支持的类型(如 datetime)

msgpack 不原生支持 datetime、自定义类等复杂类型,但可以通过扩展方式处理。

使用 ext hooks 示例:

import msgpack
from datetime import datetime

def custom_encoder(obj):
    if isinstance(obj, datetime):
        return msgpack.ExtType(1, obj.isoformat().encode('utf-8'))
    raise TypeError(f"Unknown type: {type(obj)}")

def custom_decoder(code, data):
    if code == 1:
        return datetime.fromisoformat(data.decode('utf-8'))
    return msgpack.ExtType(code, data)

# 使用编码器和解码器
now = datetime.now()
packed = msgpack.packb(now, default=custom_encoder)
restored = msgpack.unpackb(packed, ext_hook=custom_decoder)
print(restored)

default 参数用于自定义序列化逻辑,ext_hook 处理解包时的扩展类型。

注意事项

msgpack 会将字符串转为 bytes 类型进行存储,在 Python 3 中需注意 str 与 bytes 的区别。

默认情况下,unpackb 返回的 key 如果是字符串,可能在某些模式下被转为 bytes,可通过设置 raw=False 控制:

data = msgpack.unpackb(packed_data, raw=False)

这会让字符串 key 保持为 str 类型。

基本上就这些。msgpack 使用简单,性能高,适合替代 JSON 在内部系统间传递数据。注意类型兼容性和编码设置即可正常使用。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>