概要

Protobuf是一种数据格式,它支持跨语言,它有以下好处:

  • 它是按照二进制方式进行存储,同时数据协议提前定义好(这样不需要存储key),默认值字段不进行传输,因此压缩效率很高;
  • 即使数据格式发生演进,protobuf也能很方便做到向后兼容(通过序列号);
  • 被grpc集成;

本文主要通过一个示例介绍python操作protobuf的流程和关键字

示例

两个proto文件

person.proto

syntax = "proto2";import "person_info.proto";package persons;message Person {optional PersonInfo info = 1; // characteristics of the personrepeated Friend friends = 2; // friends of the person
}message Friend {optional float friendship_duration = 1; // duration of friendship in daysrepeated string shared_hobbies = 2; // shared interestsoptional Person person = 3; // identity of the friend
}

person_info.proto

syntax = "proto2";package persons;enum Sex {M = 0; // male F = 1; // femaleO = 2; // other
}message PersonInfo {optional int32 age = 1; // age in yearsoptional Sex sex = 2; optional int32 height = 3; // height in cm
}

关键字

Syntax:proto2或者proto3,是protobuf的两个版本

Import:以来别的proto文件

Package:定义的namespace空间

Enum:定义枚举类型

Messsage:类似c语言中的struct,表示结构体

Repeated:表示该字段为数组

Optional:表示该字段可以不填

Required:表示该字段必填

每个字段后都跟随一个数字,当结构体演进时数字和字段的关系保持不变。这样老版本的代码也可以读取新版本的数据,反之依然。

生成proto文件对应的python代码

protoc ./interfaces/person_info.proto --python_out generated/
protoc ./interfaces/person.proto --python_out generated/

生成对象实例

import person_pb2
import person_info_pb2############
# define friend for person of interest
#############
friend_info = person_info_pb2.PersonInfo()
friend_info.age = 40
friend_info.sex = person_info_pb2.Sex.M
friend_info.height = 165
friend_person = person_pb2.Person()
friend_person.info.CopyFrom(friend_info)
friend_person.friends.extend([])  # no friends :-(#######
# define friendship characteristics
########
friendship = person_pb2.Friend()
friendship.friendship_duration = 365.1
friendship.shared_hobbies.extend(["books", "daydreaming", "unicorns"])
friendship.person.CopyFrom(friend_person)#######
# assign the friend to the friend of interest
#########
person_info = person_info_pb2.PersonInfo()
person_info.age = 30
person_info.sex = person_info_pb2.Sex.M
person_info.height = 184
person = person_pb2.Person()
person.info.CopyFrom(person_info)
person.friends.extend([friendship])  # person with a single friend

对于简单类型(数字,字符串,布尔),可以通过‘=’直接赋值

对于repeated字段,通过extend进行赋值

对于内嵌的message字段,通过CopyFrom进行赋值

dump文件

import os
out_dir = "proto_dump"
with open(os.path.join(out_dir, "person.pb"), "wb") as f:# binary outputf.write(person.SerializeToString())
with open(os.path.join(out_dir, "person.protobuf"), "w") as f:# human-readable output for debuggingf.write(str(person))

一个是二进制格式,另一个是有可读性的json格式。我们可以看到二进制格式的文件其文件大小是另一个文件的1/5.

python操作protobuf基础相关推荐

  1. Python操作word基础

    在办公自动化的操作,往往可能会存在Word的操作.因为在办公 时,对文档的操作是必不可少的.而在Python操作Word时,可以 使用一个三方的模块库 Python-docx 安装 pip insta ...

  2. Python操作 Excel 基础操作

    Python操作 Excel 安装 读取 Excel pip install xlrd read 写入Excel pip install xlwt write 补充会用到的excel表 读取 Exce ...

  3. Python操作excel基础

    前言 导航页--数字IC设计SOC入门进阶 基于自己实际工作使用情况,做下面学习记录和整理. python 数据类型转换语法str( ) 可以把其他类型数据转化为字符串类型 int( ) 可以把其他类 ...

  4. python操作Mysql基础

    import pymysql #不修改数据 def no_data_change():db=pymysql.connect('host','user','pw','db_name')#host,use ...

  5. Python学习笔记(3):Python操作数据库

    安装MySQLdb 默认情况下Python中并没有安装MySQLdb,因此,在使用之前,我们要先安装MySQLdb. 安装步骤: 首先要下载MySQL-Python,下载地址是https://pypi ...

  6. python之numpy基础_Python知识普及:Numpy基础操作

    原标题:Python知识普及:Numpy基础操作 Numpy基础数据结构 创建数组 Numpy通用函数 import numpy as np # reshape 改变数组维度形状 ar1 = np.a ...

  7. python进阶与数据操控_零基础机器学习Python进阶:Python操作MySql

    阅读文本大概需要 6 分钟 前言 基础写了十篇,以后会继续更,这是第二篇进阶,文末会放上链接,进阶分成另一个系列,柠檬有时间会整理好菜单栏让大家更方便的阅读基础和进阶,柠檬会把自己在当时做的项目写到进 ...

  8. Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级

    前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...

  9. Python操作lxml库(基础篇)

    ​ 活动地址:CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩:迟一天就多一天平庸的困扰. 学习日记 目录 目录 学习日记 一.lxml库概述 1.lxml库介绍 2.l ...

最新文章

  1. LVTRM架构发布0.1测试版
  2. java 手动线程调度_Java Thread 多线程 操作线程
  3. clientWidth、offsetWidth、clientHeight、offsetHeight的测试比较
  4. 第三届Apache Flink比赛榜单
  5. 身边的设计模式(三):抽象工厂 与 依赖注入
  6. nssl1270-创世纪【树形dp,基环树】
  7. mybatis简单案例源码详细【注释全面】——Dao层映射文件(UserMapper.xml)【重要】
  8. java 迁移数据_Java 10迁移建议
  9. python面试题汇总(1)
  10. c语言编写网页图形界面代码,「分享」C语言如何编写图形界面
  11. Linux创建anaconda-navigator快捷图标并固定在dock上
  12. PostgreSQL 10 新特性, 流式接收端在线压缩redo
  13. SPSS26版本软件超详细安装指导+内附安装资源
  14. TT畅聊物联网(一)-初识物联网
  15. android指纹测试,Android指纹识别
  16. 【14NOIP普及组】珠心算测验
  17. matlab如何看历史,matlab创建有价值历史纪录.txt 源代码在线查看 - Matlab创建有价值历史纪录(完整版),matlab 常用的命令集锦。 资源下载 虫虫电子下载站...
  18. 将军今天讲c语言了吗第六,将军令
  19. 如何撰写专利技术交底书?交底书中有哪些坑?
  20. STM32小项目之dht11在oled上显示温湿度

热门文章

  1. element 时间选择器,设置周与周的区间
  2. i春秋python_用python爬取i春秋的课程
  3. 开源API测试工具 Hitchhiker v0.5更新 - 完善细节
  4. 数字组合(信息学奥赛一本通)
  5. Codeforces - Choosing The Commander
  6. oracle数据源ODBC的配置
  7. Java实现干支纪年法
  8. 币圈的元宇宙不是元宇宙
  9. 规划建设后的雄安新区未来会是什么样子的?
  10. CentOS8—DNS配置