首页 > 代码库 > 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=haha06 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