我有一个现有的原型文件,我想改变。我想要做的是读取文件,更改一个或两个值,然后将其作为.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中的函数也没有实现。)
答案 0 :(得分:1)
你似乎在这里混淆了几个不同的概念。
message.Message
是一个抽象基类。您需要构造一个您感兴趣的特定派生类的实例。
.proto
个文件包含类型定义,而不包含消息数据。您必须使用协议编译器.proto
编译protoc
文件。它将生成Python代码,然后您可以将其导入到程序中以构建所需的特定类型。有关详细信息,请参阅Protobuf tutorial。
使用ParseFromString()
从文件中解析二进制 protobuf数据,并使用SerializeToString()
将邮件转换回二进制数据。您应该几乎总是将二进制格式用于protobuf数据。
您引用的TextFormat
类实现了人类可读的protobufs的替代编码。对于大多数用例,建议使用 not 格式。如果你想要一个人类可读的格式,你可能最好使用JSON,但它总是比二进制编码慢得多且不那么紧凑。 TextFormat
偶尔用于调试(打印消息),有时用于编写消息数据作为源代码。 TextFormat
在Python库中可用作text_format
module。