• 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 = 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: 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

     
  • 相关阅读:
    生成R文件
    android开发问题汇总
    雅虎股票接口
    Ext4.1 , #Ext4.2
    MSSQL手工注入 报错注入方法
    MSSQL 数据库复制脚本
    Go VS Code 调式常见问题处理
    Win10 VS2012 无法注册IIS4.0 解决方案
    VirtualBox 局域网独立主机设置
    如何用.reg文件操作注册表
  • 原文地址:https://www.cnblogs.com/chuanheng/p/protobuf1.html
Copyright © 2020-2023  润新知