2016-06-01 5 views
0

Angenommen, ich habe einen binären Datenstrom stream und ich erzeuge es wie folgt.Deserialize json/yaml aus binären Datenstrom, der andere Daten enthält

stream.write('lol'.encode()) 
yaml.dump(some_obj, stream) 
stream.write('awesome'.encode()) 

Dann habe ich einen benutzerdefinierten Parser irgendeiner Art für den Stream zu schreiben, oder kann ich erholen some_obj wie folgt.

stream.read(3) 
recovered = yaml.load(stream) 
stream.read(7) 

Wenn dies nicht mit yaml Serialisierung funktioniert, funktioniert es mit JSerialisierung?

Antwort

1

Sie können nicht tun, was Sie wollen, weil der YAML-Parser sogar den kompletten Strom verbraucht, wenn Sie ein explizites Ende dummp (yaml.dump(some_obj, stream, explicit_end=True) (die im wesentlichen ...\n vor awesome einfügen) und es funktioniert auch nicht, wenn ---\nawesome (das Dokument Separator) Schreiben sowohl der YAML-Parser verbraucht das Wort awesome ¹ wenn Sie yaml.load() sowie, wenn Sie yaml.load_all() verwenden

der Teil vorne funktioniert gut, so dass Sie etwas zu tun, wie betrachten können:..

import ruamel.yaml as yaml 

file_name = 'test.comb' 

some_obj = dict(a = [1, 2], b = {3: 42}) 

with open(file_name, 'w') as stream: 
    stream.write('lol'.encode()) 
    yaml.dump(some_obj, stream, explicit_end=True) 
    stream.write('awesome'.encode()) 


with open(file_name) as stream: 
    assert stream.read(3) == 'lol' 
    stream_data = '' 
    while True: 
     stream_data += stream.read(1) 
     if stream_data[-4:] == '...\n': 
      break 
    recovered = yaml.load(stream_data) 
    assert stream.read(7) == 'awesome' 

print(recovered) 

, die (in Python2) ergibt:

{'a': [1, 2], 'b': {3: 42}} 

und die Dateiinhalte sind:

lola: [1, 2] 
b: {3: 42} 
... 
awesome 

ich eine ähnliche Technik verwenden, aber das Lesen Linien mit for line in stream, die mit normalen read() Operationen kombiniert kann nicht sein, für Dateien, die einen YAML-Header mit Metadaten haben, gefolgt von normalem Text (nicht eingerückt, damit Emacs ordnungsgemäß daran arbeiten können).


¹ ich lesen betrachten vorbei an der End-of-Stream-Marker (...) einen Fehler im Python YAML-Parser so werde ich versuchen, und dieses Problem beheben in der nächsten Version.

Verwandte Themen