/ / Deserialize json / yaml z binárneho toku, ktorý obsahuje iné údaje - python, json, serializáciu, yaml

Deserializujte json / yaml z binárneho toku, ktorý obsahuje ďalšie údaje - python, json, serialization, yaml

Predpokladám, že mám binárny prúd stream a generujem ho nasledovne.

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

Potom musím napísať vlastný parser nejakého druhu pre stream alebo môžem obnoviť some_obj nasledovne.

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

Ak to nefunguje so serializáciou yamlu, funguje to so serializáciou json?

odpovede:

1 pre odpoveď č. 1

Nemôžete robiť to, čo chcete, pretože syntaktický analyzátor YAML spotrebuje celý prúd aj v prípade, že ste dummp explicitne ukončili (yaml.dump(some_obj, stream, explicit_end=True) (ktorý v podstate vkladá ...n pred awesome) a tiež nepracuje pri písaní ---nawesome (oddeľovač dokumentov). Analyzátor YAML spotrebuje slovo awesome¹ pri používaní yaml.load() ako aj pri používaní yaml.load_all().

Časť vpredu funguje dobre, takže môžete zvážiť niečo ako:

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)

ktorý dáva (v Python2):

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

a obsah súboru:

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

Používam podobnú techniku, ale čítanie riadkov s for line in stream, ktoré nemožno kombinovať s normálnym read() operácie, pre súbory, ktoré majú hlavičku YAML s metaúdajmi, za ktorými nasleduje normálny text (tak, že emacs na ňom môžu správne pracovať).


¹ Mám za to, že čítam značku konca koncového bodu (...) chyba v Python YAML parseri, takže sa to pokúsim opraviť v ďalšom vydaní.