首页 > 代码库 > python读写protobuf
python读写protobuf
0. 前期准备
官方protobuf定义
https://code.google.com/p/protobuf/
python使用指南
https://developers.google.com/protocol-buffers/docs/pythontutorial
http://blog.csdn.net/love_newzai/article/details/6906459
安装 python对protobuf的支持
wget https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.bz2
tar -vxjf protobuf-2.5.0.tar.bz2
cd protobuf-2.5.0
./configure --prefix=/home/admin/mypython/
make ; make install
1 准备.proto文件
struct_oss_pb.proto
1 message entity_attr 2 { 3 required int32 attr_id = 1; // 属性类型标识,比如:标题属性为 1,正文属性为2,图片属性为 3,发现时间属性为4,原始url属性为5 ,父页面属性为 6; 4 required bytes attribute = 2; // 属性类型描述,比如“标题”,“ 正文”,“图片”,“发现时间”,“原始 url”,“父页面 ”等 5 repeated bytes value = http://www.mamicode.com/3; // 属性值,除“图片”只保留 osskey之外,其他保留原文。考虑到文章中会保留多幅图,所以采用repeated。 6 }; 7 8 message entity_desc 9 {10 required int32 entity_id = 1; // 实体类型标识,比如:新闻为 1,小说为2 。11 required bytes entity_name = 2; // 实体名称,比如:新闻主题事件关键词,小说名等。12 repeated entity_attr attributes = 3; // 属性描述,格式见entity_attr。13 };
2. 将proto转化为 xxx_pb2.py ,然后在你的程序里import这个py
protoc --python_out=./ ./struct_oss_pb.proto
得到struct_oss_pb_pb2.py
3. 读写protobuf的示例python
test_pb.py
01 # coding: gbk02 import struct_oss_pb_pb203 entitydesc=struct_oss_pb_pb2.entity_desc()04 entitydesc.entity_id=105 entitydesc.entity_name=‘haha‘06 07 #create proto 08 entityattr=entitydesc.attributes.add() #嵌套message09 entityattr.attr_id = 1110 entityattr.attribute = ‘标题‘.decode(‘gbk‘).encode(‘utf-8‘)11 entityattr.value.append("title adfadf") 12 13 entity_attr_str=entityattr.SerializeToString() 14 print entity_attr_str15 entitydesc_str=entitydesc.SerializeToString() 16 print entitydesc_str 17 print ‘----‘18 #read19 entityattr2 = struct_oss_pb_pb2.entity_attr()20 entityattr2.ParseFromString(entity_attr_str)21 print entityattr2.attr_id 22 print entityattr2.attribute.decode(‘utf-8‘).encode(‘gbk‘)23 for i in entityattr2.value:24 print i25 26 print ‘----‘27 entitydesc2=struct_oss_pb_pb2.entity_desc()28 entitydesc2.ParseFromString(entitydesc_str) 29 print entitydesc2.entity_id30 #repeated entity_attr attributes,由于是repeated需要遍历31 for oneatt in entitydesc2.attributes:32 print oneatt.attr_id33 for i in oneatt.value:34 print i
Protobuf定义了一套基本数据类型。几乎都可以映射到C++\Java等语言的基础数据类型.
protobuf 数据类型 | 描述 | 打包 | C++语言映射 |
bool | 布尔类型 | 1字节 | bool |
double | 64位浮点数 | N | double |
float | 32为浮点数 | N | float |
int32 | 32位整数、 | N | int |
uint32 | 无符号32位整数 | N | unsigned int |
int64 | 64位整数 | N | __int64 |
uint64 | 64为无符号整 | N | unsigned __int64 |
sint32 | 32位整数,处理负数效率更高 | N | int32 |
sing64 | 64位整数 处理负数效率更高 | N | __int64 |
fixed32 | 32位无符号整数 | 4 | unsigned int32 |
fixed64 | 64位无符号整数 | 8 | unsigned __int64 |
sfixed32 | 32位整数、能以更高的效率处理负数 | 4 | unsigned int32 |
sfixed64 | 64为整数 | 8 | unsigned __int64 |
string | 只能处理 ASCII字符 | N | std::string |
bytes | 用于处理多字节的语言字符、如中文 | N | std::string |
enum | 可以包含一个用户自定义的枚举类型uint32 | N(uint32) | enum |
message | 可以包含一个用户自定义的消息类型 | N | object of class |
python读写protobuf
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。