python读写protobuf

From: http://blog.sina.com.cn/s/blog_7575a6190101u86f.html


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


message  entity_attr
{
      required  int32  attr_id  1;             //  属性类型标识,比如:标题属性为  1 ,正文属性为 2 ,图片属性为  3 ,发现时间属性为 4 ,原始url 属性为 5  ,父页面属性为  6
      required  bytes  attribute  2;       //  属性类型描述,比如“标题”,“  正文”,“图片”,“发现时间”,“原始  url ”,“父页面  ”等
      repeated  bytes  value  3;             //  属性值,除“图片”只保留  osskey 之外,其他保留原文。考虑到文章中会保留多幅图,所以采用repeated
};

message  entity_desc
{
      required  int32  entity_id  1;                             //  实体类型标识,比如:新闻为  1 ,小说为 2 
      required  bytes  entity_name  2;                   //  实体名称,比如:新闻主题事件关键词,小说名等。
      repeated  entity_attr  attributes  3;     //  属性描述,格式见entity_attr
};


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: gbk
02 import struct_oss_pb_pb2
03 entitydesc=struct_oss_pb_pb2.entity_desc()
04 entitydesc.entity_id=1
05 entitydesc.entity_name='haha'
06 
07 #create proto  
08 entityattr=entitydesc.attributes.add() #嵌套message
09 entityattr.attr_id 11
10 entityattr.attribute '标题'.decode('gbk').encode('utf-8')
11 entityattr.value.append("title adfadf")  
12 
13 entity_attr_str=entityattr.SerializeToString()  
14 print entity_attr_str
15 entitydesc_str=entitydesc.SerializeToString()  
16 print entitydesc_str    
17 print '----'
18 #read
19 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 in entityattr2.value:
24    print i
25    
26 print '----'
27 entitydesc2=struct_oss_pb_pb2.entity_desc()
28 entitydesc2.ParseFromString(entitydesc_str)    
29 print entitydesc2.entity_id
30 #repeated entity_attr attributes,由于是repeated需要遍历
31 for oneatt in entitydesc2.attributes:
32    print oneatt.attr_id
33    for 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


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值