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.