python操作protobuf基础
概要
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基础相关推荐
- Python操作word基础
在办公自动化的操作,往往可能会存在Word的操作.因为在办公 时,对文档的操作是必不可少的.而在Python操作Word时,可以 使用一个三方的模块库 Python-docx 安装 pip insta ...
- Python操作 Excel 基础操作
Python操作 Excel 安装 读取 Excel pip install xlrd read 写入Excel pip install xlwt write 补充会用到的excel表 读取 Exce ...
- Python操作excel基础
前言 导航页--数字IC设计SOC入门进阶 基于自己实际工作使用情况,做下面学习记录和整理. python 数据类型转换语法str( ) 可以把其他类型数据转化为字符串类型 int( ) 可以把其他类 ...
- python操作Mysql基础
import pymysql #不修改数据 def no_data_change():db=pymysql.connect('host','user','pw','db_name')#host,use ...
- Python学习笔记(3):Python操作数据库
安装MySQLdb 默认情况下Python中并没有安装MySQLdb,因此,在使用之前,我们要先安装MySQLdb. 安装步骤: 首先要下载MySQL-Python,下载地址是https://pypi ...
- python之numpy基础_Python知识普及:Numpy基础操作
原标题:Python知识普及:Numpy基础操作 Numpy基础数据结构 创建数组 Numpy通用函数 import numpy as np # reshape 改变数组维度形状 ar1 = np.a ...
- python进阶与数据操控_零基础机器学习Python进阶:Python操作MySql
阅读文本大概需要 6 分钟 前言 基础写了十篇,以后会继续更,这是第二篇进阶,文末会放上链接,进阶分成另一个系列,柠檬有时间会整理好菜单栏让大家更方便的阅读基础和进阶,柠檬会把自己在当时做的项目写到进 ...
- Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级
前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...
- Python操作lxml库(基础篇)
活动地址:CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩:迟一天就多一天平庸的困扰. 学习日记 目录 目录 学习日记 一.lxml库概述 1.lxml库介绍 2.l ...
最新文章
- LVTRM架构发布0.1测试版
- java 手动线程调度_Java Thread 多线程 操作线程
- clientWidth、offsetWidth、clientHeight、offsetHeight的测试比较
- 第三届Apache Flink比赛榜单
- 身边的设计模式(三):抽象工厂 与 依赖注入
- nssl1270-创世纪【树形dp,基环树】
- mybatis简单案例源码详细【注释全面】——Dao层映射文件(UserMapper.xml)【重要】
- java 迁移数据_Java 10迁移建议
- python面试题汇总(1)
- c语言编写网页图形界面代码,「分享」C语言如何编写图形界面
- Linux创建anaconda-navigator快捷图标并固定在dock上
- PostgreSQL 10 新特性, 流式接收端在线压缩redo
- SPSS26版本软件超详细安装指导+内附安装资源
- TT畅聊物联网(一)-初识物联网
- android指纹测试,Android指纹识别
- 【14NOIP普及组】珠心算测验
- matlab如何看历史,matlab创建有价值历史纪录.txt 源代码在线查看 - Matlab创建有价值历史纪录(完整版),matlab 常用的命令集锦。 资源下载 虫虫电子下载站...
- 将军今天讲c语言了吗第六,将军令
- 如何撰写专利技术交底书?交底书中有哪些坑?
- STM32小项目之dht11在oled上显示温湿度