一、概述

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

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

二、安装

  1. 下载目标语言的编译器:下载地址
  2. 安装:
$ ./configure
$ make
$ sudo make install
  1. 验证安装:protoc --version,显示当前版本:libprotoc x.x.x
  2. 安装 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 为二进制的数据,否则会出现各种非预期错误

五、参考

Python 转化成 PB 格式数据的更多相关文章

  1. Python将JSON格式数据转换为SQL语句以便导入MySQL数据库

    前文中我们把网络爬虫爬取的数据保存为JSON格式,但为了能够更方便地处理数据.我们希望把这些数据导入到MySQL数据库中.phpMyadmin能够把MySQL数据库中的数据导出为JSON格式文件,但却 ...

  2. python多种格式数据加载、处理与存储

    多种格式数据加载.处理与存储 实际的场景中,我们会在不同的地方遇到各种不同的数据格式(比如大家熟悉的csv与txt,比如网页HTML格式,比如XML格式),我们来一起看看python如何和这些格式的数 ...

  3. python打印表格式数据,留出正确的空格和段落星号或注释

    python打印表格式数据,留出正确的空格,格式化打出 代码如下: def printPicnic(itemsDict,leftWidth,rightWidth): print('PICNIC ITE ...

  4. python中json格式数据输出实现方式

    python中json格式数据输出实现方式 主要使用json模块,直接导入import json即可. 小例子如下: #coding=UTF-8 import json info={} info[&q ...

  5. PB导出数据excel格式dw2xls

    PB导出数据excel格式dw2xls 使用DW2XLS控件 语法 uf_save_dw_as_excel ( dw, filename ) 參数 dw A reference to the data ...

  6. Python处理NetCDF格式数据为TIFF数据(附脚本代码)

    博客小序:NetCDF格式数据广泛应用于科学数据的存储,最近几日自己利用python处理了一些NetCDF数据,特撰此博文以记之. 参考博客: https://www.cnblogs.com/shou ...

  7. python打印表格式数据-星号或注释

    python打印表格式数据,留出正确的空格,格式化打出 代码如下: def printPicnic(itemsDict,leftWidth,rightWidth): print('PICNIC ITE ...

  8. iOS开发之JSON格式数据的生成与解析

    本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据? ...

  9. TensorFlow 自定义模型导出:将 .ckpt 格式转化为 .pb 格式

    本文承接上文 TensorFlow-slim 训练 CNN 分类模型(续),阐述通过 tf.contrib.slim 的函数 slim.learning.train 训练的模型,怎么通过人为的加入数据 ...

随机推荐

  1. java之Hibernate框架实现数据库操作

    之前我们用一个java类连接MySQL数据库实现了数据库的增删改查操作---------MySQL篇: 但是数据库种类之多,除了MySQL,还有Access.Oracle.DB2等等,而且每种数据库语 ...

  2. 机器学习(2) - KNN识别MNIST

    代码 https://github.com/s055523/MNISTTensorFlowSharp 数据的获得 数据可以由http://yann.lecun.com/exdb/mnist/下载.之后 ...

  3. datalist 分页

    Asp.net提供了三个功能强大的列表控件:GridView.DataList和Repeater控件,相对GridView,DataList和Repeater控件具有更高的样式自定义性,很多时候我们喜 ...

  4. spring+springmvc+mybatis构建系统

    今天和大家分享的是spring+springmvc+mybatis搭建框架的例子,说到这里不得不说现在市面上一流大公司还有很多用这种架子,创业型公司大部分都用springboot集成的mvc+myba ...

  5. FPA笔记三 数据功能的识别

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://welkinhu.blog.51cto.com/447606/115477     ...

  6. eclipse汉化链接

    百度百科 https://jingyan.baidu.com/article/4b07be3cb1864e48b380f315.html 博客园:http://blog.csdn.net/sunny_ ...

  7. MongoDB安装与配置

    参考文档:MongoDB官方文档 版本:3.6.4 从版本3.6开始,MongoDB需要Windows Server 2008 R2,Windows 7或更高版本. 第一步,在下载中心下载最新版本的M ...

  8. 详解vue的diff算法

    前言 我的目标是写一个非常详细的关于diff的干货,所以本文有点长.也会用到大量的图片以及代码举例,目的让看这篇文章的朋友一定弄明白diff的边边角角. 先来了解几个点... 1. 当数据发生变化时, ...

  9. React官方文档笔记之快速入门

    快速开始 JSFiddle 我们建议在 React 中使用 CommonJS 模块系统,比如 browserify 或 webpack. 要用 webpack 安装 React DOM 和构建你的包: ...

  10. 【新手向】自用的tooltip小插件,前端插件知识科普~

    上面的tooltip就是成品图,为了和自己站点的风格保持一致所以自己写的. 第一部分:你绝对碰到过的匿名函数闭包问题 第二部分:写个tooltip demo 第三部分:源码地址 第一部分 你绝对碰到过 ...