Protobuf:python版使用

news2025/1/9 2:19:48

目录

Protobuf详解

Python使用方式

下载protoc

编写.proto协议文件

编译Protocol buffer

存储/读取数据测试


Protobuf详解

  • 深入 ProtoBuf - 简介 - 简书 (jianshu.com)
  • [索引]文章索引 - 简书 (jianshu.com)
  •  Protobuf3语法详解 - 望星辰大海 - 博客园 (cnblogs.com)

Python使用方式

参考:menghaocheng/hello_protobuf: python如何使用protobuf3 (github.com)

步骤:

  1. 下载protoc(protocol compiler)
  2. 编写.proto文件
  3. 编译(生成xxxx_pb2.py)
  4. 引用xxxx_pb2.py:存储、读取数据

1.下载protoc

下载地址:https://github.com/google/protobuf/releases

根据自己的平台下载对应的编译器,如win10-64位:

 解压到指定目录下:

 设置环境变量,使在任何地方可以使用protoc指令:

 测试protoc:新打开一个命令行:输入protoc --version,如果将输出版本号,说明protoc安装好了

 protoc-21.12-osx-x86_64对应的版本是3.19.1

2.编写.proto协议文件

新建一个hello_protobuf文件夹,并用pycharm打开该文件夹。

新建协议文件:在hello_protobuf/protobuf/目录下手动创建addressbook.proto文件

syntax = "proto3";
 
message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
 
  enum PhoneType {
    MOBILE = 0;     //私人手机
    HOME = 1;       //家庭电话
    WORK = 2;       //工作电话
  }
 
  message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
  }
 
  repeated PhoneNumber phones = 4;
}
 
message AddressBook {
  repeated Person people = 1;
}

解释: 

  • syntax = "proto3"; 指定正在使用 proto3 语法,否则 protobuf 将默认使用的是 proto2。这个指定语法行必须是文件的非空非注释的第一个行。
  • package Test; 包申明,指定命名空间(C# 中)。对于 Python,这个包声明符是被忽略的,因为Python模块是按照其在文件系统中的位置进行组织的。
  • message 是关键字,定义结构化数据。
  • 等号后面的数字是字段唯一编号(注意不是字段的值),用于二进制格式消息中标识字段。

protoc 是 protobuf 自带的编译器,可以将 .proto 文件编译成 java、python、go、C# 等多种语言的代码,直接引用。

3.编译Protocol buffer

打开命令行,cd到hello_protobuf/protobuf/下,执行

protoc --python_out=./ addressbook.proto

或者在任意位置执行:

protoc -I=F:\hello_protobuf\protobuf --python_out=F:\hello_protobuf\protobuf addressbook.proto

 编译命令说明:

  • -I:表示源文件(.proto 文件)所在文件夹路径。
  • --python_out:表示目标语言为 python,且指定生成的 .py 文件存放目录。
  • addressbook.proto 为源文件文件名,如果有多个,空格隔开。

 没有输出说明未出错。

新生成hello_protobuf/protobuff/addressbook_pb2.py——这是我们python最终要用的协议文件了。

4.存储/读取数据测试

(1)序列化:addressbook_test_writing.py

from protobuf import addressbook_pb2
import os


def PromptForAddress(person):
    person.id = 1
    person.name = "mc.meng"
    person.email = "menghaocheng@qq.com"
    phone_number = person.phones.add()
    phone_number.number = "18565772445"
    phone_number.type = addressbook_pb2.Person.MOBILE


def write_test():
    address_book = addressbook_pb2.AddressBook()

    address_book_file = "./data/addressbook.txt"

    if not os.path.exists(address_book_file):
        os.mkdir(address_book_file)

    # 读取文本初始内容
    try:
        f = open(address_book_file, "rb")
        address_book.ParseFromString(f.read())
        f.close()
    except IOError:
        print(address_book_file + ": Could not open file.  Creating a new one.")

    PromptForAddress(address_book.people.add())

    # 追加新内容
    f = open(address_book_file, "wb")
    f.write(address_book.SerializeToString())
    f.close()


if __name__ == "__main__":
    write_test()

hello_protobuf/data/目录用于存放数据

执行addressbook_test_writing.py后,在hello_protobuf/data/下生成了addressbook.txt文件:

 (2)反序列化:address_test_reading.py

import protobuf.addressbook_pb2 as addressbook_pb2


def ListPeople(address_book):
    for person in address_book.people:
        print("Person ID:", person.id)
        print("  Name:", person.name)
        print("  E-mail address:", person.email)

        for phone_number in person.phones:
            if phone_number.type == addressbook_pb2.Person.MOBILE:
                print("  Mobile phone #: ", end='')
            elif phone_number.type == addressbook_pb2.Person.HOME:
                print("  Home phone #: ", end='')
            elif phone_number.type == addressbook_pb2.Person.WORK:
                print("  Work phone #: ", end='')
            print(phone_number.number)


def read_test():
    address_book = addressbook_pb2.AddressBook()
    address_book_file = "./data/addressbook.txt"

    f = open(address_book_file, "rb")
    address_book.ParseFromString(f.read())
    f.close()

    ListPeople(address_book)


if __name__ == "__main__":
    read_test()

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/126320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

联芸科技冲刺科创板上市:业绩表现不稳定,实控人方小玲为美国籍

12月28日,联芸科技(杭州)股份有限公司(下称“联芸科技”)在上海证券交易所递交招股书,准备在科创板上市。 本次冲刺上市,联芸科技计划募资20.50亿元,其中4.66亿元用于新一代数据存储…

prophet模块学习总结-20221228

prophet模块的基本介绍及相关用法说明。 文章目录1.基本介绍Prophet包的特点2.Prophet 模型介绍2.1 长期趋势模型2.2 The Seasonality Function(季节函数)2.3 The Holiday/Event Function(节日函数)3.使用示例3.1 快速开始3.2 调节…

MetersPhere自动化解决用户登录问题+添加钉钉机器人

MetersPhere自动化解决用户登录问题添加钉钉机器人 现在遇到的问题,做自动化的时候几乎每个接口都需要token,这个token是登录获取的,那我有很多个自动化的场景,如果我每一个场景都加入登录接口,同时执行很多场景的时候…

骨传导耳机有用吗,最好用的骨传导耳机分享

骨传导耳机有没有用这个问题,主要还是看自己需要骨传导耳机的根本需求是什么,骨传导耳机更多的使用场景是在户外运动,但是日常才室内使用或者长时间使用的耳机爱好者,骨传导耳机也能在一定程度上保护听力,下面就分享五…

浅聊OpenHarmony

接触OpenHarmony快一年了,这里简单总结下自己对OpenHarmony的理解,如果有不对的地方,欢迎来讨论。OpenHarmony是什么?了解这个之前我们可以先来看看什么是开源? 一、开源是什么? 开源简单来讲&#xff0c…

阿里云视频点播资源迁移及回溯校验

阿里云视频点播资源迁移及回溯校验一:准备环境1.1、搭建springboot1.2、引入外部包二:表与配置2.1、拉取视频点播文件2.2、建表2.3、yml配置文件三:代码3.1、XML3.2、entity3.3、mapper3.4、Synchronize3.5、视频迁移Controller3.6、视频回溯…

Fedora初始化 | python在Fedora中的初始化搭建

本来是想玩一下ArticlePairMatching-master,结果需要graph-tool工具,这哥们需要c等环境,无法在window中直接安装。 望着不堪重负的win系统,还是安了一个全新的Fedora虚拟机作为实验环境吧。 1. 使用VMWare安装Fedora Fedora的图形…

户外徒步戴什么耳机比较好、最适合户外运动的五款耳机推荐

现在人们对自己的身体状态越来越重视了,无论是怎样的生活,一个健康的身体非常重要,近几年的运动健身热潮的兴起,能看出来人们会花更多的时间去锻炼自己的身体了,与之而来的就是各种健身、运动的蓝牙耳机不断的推陈出新…

2022餐馆设计最新十大排行榜(附餐馆设计案例图片)

随着生活水平的提升,人们对于用餐的环境要求越来越高,对于餐馆设计的要求随之提高,因此在装修时,很多餐饮老板想找一家实力强的餐厅设计公司,那么国内的餐饮设计公司数量庞大,有哪些擅长餐饮设计呢&#xf…

android生成javadoc

生成步骤 菜单 Tools -> Generate JavaDoc! 问题: 1.JavaDoc导出时出现乱码报错 错误: 编码GBK的不可映射字符 菜单 Tools -> Generate JavaDoc,弹出配置面板 在Other command line arguments 栏输入:-encoding utf-8 -charset utf-8 2.提示 程序…

C/S快速开发框架源码 winform快速开发框架源码

C/S系统开发框架源码 C#快速开发框架源码(CS版)00683 源码分享,需要源码学习可私信我。 系统功能: 该框架采用逻辑上的三层模式开发业务处理和数据处理完全分开,采用C#语言和MSSQL进行开发,主要实现了菜…

微信小程序 会议OA项目-其它页面04

目录 1.会议管理 1.1 自定义tabs组件 1.2 会议管理 2.投票管理 3.个人中心 1.会议管理 1.1 自定义tabs组件 文档参考:自定义组件 | 微信开放文档微信开发者平台文档https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/ 新建一个文件夹&#xff1…

尚医通-数据字典-EasyExcel-导入 导出(十四)

目录: (1)EasyExcel-写操作 (2)EasyExcel-读操作 (3)后台系统-数据字典-导出 (4) 后台系统-数据字典-导入 (1)EasyExcel-写操作 往数据字典里…

家用摄像头选择(户内外)

不知道摄像头怎么选?看下面几篇就够了。 1、户外监控摄像头,哪个品牌的比较好? - 知乎 2、【室外篇】家用监控摄像头选购要素及不同场景下高性价比监控摄像头推荐 - 知乎 3、家用摄像头选什么牌子的好? - 知乎 优先选焦距 IP防水防尘&…

超宽带(UWB)开发板BU0/DW1000性能测试

简介 本实验目的是测试NodeMCU-BU01开发板测距的性能。 BU01是基于Decawave的DW1000设计的超宽带(UWB)收发器模组。BU01可以用于双向测距或TWR定位系统中,定位精度可达到10厘米,并支持高达6.8 Mbps的数据速率。 UWB技术是一种使…

“ 1天投200次简历,依旧石沉大海 ” 这届年轻人的“求职焦虑”,如何缓解?

最近在新闻上看到这样一则热议事件:“1天投200次简历”?多方发力,缓解应届生“求职焦虑”。 教育部公布的数据显示,我国2022届全国普通高校毕业生数量为1076万人,而2023届预计达1158万人,同比将增加82万人…

通过webpack配置【程序打包时间】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、webpack打包定义全局常量二、将全局常量设置为当前时间三、在console中输出BUILDTIME前言 大家都是做项目研发的,“打包”、“提测”、“发版”…

低代码-零代码基础教育结合场景

在此次大会上,杭州市学军小学教育集团总校长张军林受邀出席。作为将低代码与校园教学管理成功结合运用的一所数字化小学,校长张军林在会上分享了他的数智化管理思想,并发布了学军小学智慧校园系统—学军大脑2.0。 “学军大脑2.0是基于钉钉宜…

ES6-ES11笔记(2)

笔记 (https://www.bilibili.com/video/BV1uK411H7on?p30&vd_source3cf72bb393b8cc11b96c6d4bfbcbd890) 1.ES6 1.14集合介绍与API 1.14.1 set常用的api //声明一个set //set 里面的元素是唯一的,会自动去重 let s1 new Set(); //创建 //可以传入可以迭代的数据 let s…

Windows服务器调整TLS1.2加密套件

由于部分服务器默认不支持:TLS1.2加密条件,这会导致谷歌、火狐等浏览器无法访问网站,这种情况下需要调整加密条件。 支持TLS1.2协议的服务器操作系统需要:windows 2008R2 IIS7以上。 注意:微软说明windows 2003、win…