protobuf:text_format模块抱怨"需要像对象这样的字节"

时间:2017-08-02 11:38:41

标签: python protocol-buffers

我最近开始使用protobuf。我遇到了如下问题:

我创建了一个protobuf消息,填写了一些内容,并将文本格式写入磁盘:

f = open('/home/centos/pb.conf','w')
f.write( text_format.MessageToString(c))

现在我尝试从磁盘读出protobuf,回到python对象:

c2=cf.Configure()
input = open('/home/centos/pb.conf','rb')
b = input.read()
text_format.Merge(b, c2)

然后,遗憾的是,我收到了这个错误:

    471   return MergeLines(
--> 472       text.split('\n'),
    473       message,
    474       allow_unknown_extension,

TypeError: a bytes-like object is required, not 'str'
然而,似乎' b'是字节格式:

Out[49]: b'name: "david"\ncar_fe_config {\n  name: "style_slow"\n}\nfleet_fe_config {\n  name: "style_fast"\n}\n'

发生了什么事?

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为Merge()有一个内部方法MergeLines(),它在换行符("\n")的字符串表示形式上进行拆分。如果传入字节表示,则必须在.split(b"\n")上拆分以避免错误,但拆分器被硬编码为字符串。

尝试将保存的数据作为字符串阅读(例如,使用open(<filename>, 'r')代替'rb'),这应该有用。