使用python替换protobuf文件中的行

时间:2014-09-22 22:44:08

标签: python protocol-buffers

我有一个现有的原型文件,我想改变。我想要做的是读取文件,更改一个或两个值,然后将其作为.proto文件写回磁盘,由另一个程序读取。根据{{​​3}},我应该可以这样写:

from google.protobuf import message

msg = message.Message()
msg.ParseFromString(infile.read())

... (make changes)

outfile.write(msg.SerializeToString())

但它只给了我一个NotImplementedError。我需要与protobuf文本文件接口的库在哪里? this documentation似乎适用于C ++,为什么没有为python实现? (不,google.protobuf.text_format中的函数也没有实现。)

1 个答案:

答案 0 :(得分:1)

你似乎在这里混淆了几个不同的概念。

message.Message是一个抽象基类。您需要构造一个您感兴趣的特定派生类的实例。

.proto个文件包含类型定义,而不包含消息数据。您必须使用协议编译器.proto编译protoc文件。它将生成Python代码,然后您可以将其导入到程序中以构建所需的特定类型。有关详细信息,请参阅Protobuf tutorial

使用ParseFromString()从文件中解析二进制 protobuf数据,并使用SerializeToString()将邮件转换回二进制数据。您应该几乎总是将二进制格式用于protobuf数据。

您引用的TextFormat类实现了人类可读的protobufs的替代编码。对于大多数用例,建议使用 not 格式。如果你想要一个人类可读的格式,你可能最好使用JSON,但它总是比二进制编码慢得多且不那么紧凑。 TextFormat偶尔用于调试(打印消息),有时用于编写消息数据作为源代码。 TextFormat在Python库中可用作text_format module