2017-08-02 77 views
0

我最近开始使用protobuf。我有如下一个问题:protobuf:text_format模块抱怨“需要类似对象的字节”

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

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

现在我尝试从磁盘读取的protobuf出来,放回蟒蛇对象:

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' 

howeve r,似乎'b'中的消息是字节格式:

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

有什么线索发生了什么?

回答

0

发生这种情况的原因是Merge()有一个内部方法MergeLines(),它在新行("\n")的字符串表示形式上进行拆分。如果你传递一个字节表示,它将不得不在.split(b"\n")上分割以避免错误,但分割器被硬编码为一个字符串。

尝试以字符串的形式读取保存的数据(例如,使用open(<filename>, 'r')而不是'rb'),这应该可行。

相关问题