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ď č. 1Nemôž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í.