使用Python 转化成 PB 格式数据的方法

本文介绍了Protocol Buffers(protobuf或PB)的基本概念,它是Google开发的一种高效的数据存储格式,适用于数据序列化和RPC。文章详细讲解了如何在Python环境中安装protobuf编译器和库,并通过实例展示了如何编译.proto文件,解析和写入PB数据。此外,还提到了将protobuf转换为dict的方法,并提供了一个遇到的错误示例:'google.protobuf.message.DecodeError: Truncated message.' 最后,推荐了相关的学习资源。
部署运行你感兴趣的模型镜像

一、概述

Protocol Buffers 是 Google 公司开发的一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

Protocol Buffers 简称为 protobuf 或 pb,下面是使用 python 解析 pb。

二、安装

下载目标语言的编译器:下载地址

安装:

$ ./configure  
$ make  
$ sudo make install 

验证安装:protoc --version,显示当前版本:libprotoc x.x.x
安装 Python 的 protobuf 库:pip install protobuf

三、使用

1 编译 proto 文件

Protobuf 语义清晰,无需类似 XML 解析器的东西(因为 Protobuf 编译器会将 .proto 文件编译生成对应的数据访问类以对 Protobuf 数据进行序列化、反序列化操作)。

protoc --python_out=./ ./文件名.proto  

这时会在当前目录生成一个与文件名同名的目录,该目录下会有一个 .py 文件。这个文件会用作模块、解析规则去解析 pb 的源数据。

2 解析 pb 的数据
from test_pb import Test # 从刚才编译出来的 py 文件中 import 解析的类
message = Test()
with open('test.pb', 'rb') as fb:
    pb_content = fb.read() # 如果文件很大,则要分批读取
    # pb_content 是二进制的pb数据,如果是文件,则需要用 open 方法读取数据
    message.ParseFromString(pd_content)
print (message)
3 写入数据
from test_pb import Test # 从刚才编译出来的 py 文件中 import 解析的类
message = Test()
message.name = 'hello world' # 赋值
with open('test.pb', 'wb') as fb:
    # 序列化,写入文件
    fb.write(person.SerializeToString())
4 probuf 转 dict

当 probuf 的数据包含中文时,解析后对于阅读十分不友好。同时如果想要把 probuf 对象转化成 dict 进行后续操作的话。可以试试第三方库:protobuf-to-dict,这个库可以很方便的把 probuf 的数据转化成 dict。示例代码如下:

from protobuf_to_dict import protobuf_to_dict
my_message = MyMessage()
# pb_my_message is a protobuf string
my_message.ParseFromString(pb_my_message)
protobuf_to_dict(my_message)
# 输出:{'message': 'Hello'}
5 更多

这篇文章只是使用 python 简单的解析、序列化。

四、错误

google.protobuf.message.DecodeError: Truncated message.:首先要保证 pb source 为二进制的数据,否则会出现各种非预期错误

结尾给大家推荐一个非常好的学习教程,希望对你学习Python有帮助!

Python基础入门教程推荐:←点击左边蓝色文字就可以跳转观看了

Python爬虫案例教程推荐:←点击左边蓝色文字就可以跳转观看了

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值