一、概述

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. 异步任务spring @Async注解源码解析

    1.引子 开启异步任务使用方法: 1).方法上加@Async注解 2).启动类或者配置类上@EnableAsync 2.源码解析 虽然spring5已经出来了,但是我们还是使用的spring4,本文就 ...

  2. MongoDB学习--安装与管理

    一.简介 MongoDB是一种强大.灵活,且易于扩展的通用型数据库.他能扩展出非常多的功能.如二级索引(secondary index).范围查询(range query).排序.聚合(aggrega ...

  3. webpack4:连奏中的进化

    webpack4在2月底的时候发布,这次webpack4有了一个名字"Legato",也就是"连奏"的意思,寓意webpack在不断进化,而且是无缝(no-ga ...

  4. iframe跨域动态设置主窗口宽高

    Q:在A项目的a页面嵌入一个iframe,src是B项目的b页面,怎样让a页面的高度跟b页面的高度一样? A:解决跨域方案:增加一个A项目的c页面. 操作步骤: 一,a页面的iframe设置: 获取到 ...

  5. mysql的内建日期处理函数

    下面的表格列出了MySQL 中最重要的内建日期函数: 函数 描述 NOW() 返回当前的日期和时间 CURDATE() 返回当前的日期 CURTIME() 返回当前的时间 DATE() 提取日期或日期 ...

  6. Hibernate中的常用API

    1.Configuration 1.1 加载核心配置文件, 加载hibernate.properties时:Configuration configuration = new Configuratio ...

  7. SSM-SpringMVC-16:SpringMVC中小论注解式开发之访问方式篇

     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 访问方式可以指定,打个比方,你通过get方式进入登陆页面,通过post发送ajax数据库校验或者post提交 ...

  8. onConfigurationChanged方法的使用

    在日常生活中,手机会有很多种配置放生改变的情况,当然,有些时候需要监听他们并对他们进行处理,这就涉及到了onConfiguration方法的使用,我大致说一下,这个方法需要发生在屏幕切换横竖屏,或者选 ...

  9. Linux时间子系统之一:认识timer_list和timer_stats和使用

    内核版本:v3.4.xxx 一.前言 内核提供了方便查看当前系统TickDevice.活动的Timer列表以及Timer使用的统计信息. 内核分别用两个节点来表示TimerList和Timer统计信息 ...

  10. 基于E-R模型的关系型数据库设计方法

    摘要 在管理信息系统开发中,数据库设计的目标是建立DBMS能识别的关系数据模型.而关系数据模型建立的基础是首先建立E-R模型,通过E-R模型才能转换为关系数据模型.如何建立E-R模型以及如何将E-R模 ...