Python 转化成 PB 格式数据
2024-09-05 05:42:02
一、概述
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
三、使用
3.1 编译 proto 文件
Protobuf 语义清晰,无需类似 XML 解析器的东西(因为 Protobuf 编译器会将 .proto 文件编译生成对应的数据访问类以对 Protobuf 数据进行序列化、反序列化操作)。
protoc --python_out=./ ./文件名.proto
这时会在当前目录生成一个与文件名同名的目录,该目录下会有一个 .py
文件。这个文件会用作模块、解析规则去解析 pb 的源数据。
3.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.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())
3.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'}
3.5 更多
这篇文章只是使用 python 简单的解析、序列化。更多细节以及原理推荐阅读Google Protocol Buffer 的使用和原理
四、错误
google.protobuf.message.DecodeError: Truncated message.
:首先要保证 pb source 为二进制的数据,否则会出现各种非预期错误
五、参考
最新文章
- 数论 - Pairs(数字对)
- Tools - VirtualBox
- GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件
- virtual关键字的本质是什么?
- 公司mysql数据库设计与优化培训ppt
- HDU 4911
- 【技术贴】webservice cxf2 客户端动态调用报错No operation was found with the name
- 解决eclipse+tomcat7的中文乱码的一个方法
- [PWA] 2. Service worker life cycle
- PHP学习笔记十【数组】
- Oracle系统表实用操作笔记
- linux学习之路--(三)文件系统
- java中抽象类的概念
- knockout为绑定元素生成id
- tornado--初识tornado
- 容器化 — 基于Docker技术容器云
- Qt ------ 在 ubuntu 内安装 Qt creator
- Inno Setup入门(四)——为程序创建桌面快捷方式
- C# string[]转List<;string>;
- MongoDB操作库/表
热门文章
- Pygame常用方法
- php定时执行操作及ob_flush()与flush()的使用
- 不使用JavaScript实现菜单的打开和关闭
- Net Core动态加载webservice/WCF
- 【转】Javascript错误处理——try…catch
- redis主从相关问题
- 十七、Hadoop学记笔记————Hbase入门
- SSM-MyBatis-18:Mybatis中二级缓存和第三方Ehcache配置
- Spring Boot 2.0 教程 - 配置详解
- Circular view path [home]: would dispatch back to the current handler URL [/home] again. Check your ViewResolver setup!