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文件
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 i 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 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
|
加载中,请稍候......