2017-08-02 85 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'),這應該可行。

相關問題