2016-06-01 4 views
0

バイナリストリームstreamがあり、次のように生成すると仮定します。他のデータを含むバイナリストリームからjson/yamlを非直列化する

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

は、それから私は、ストリームのためのいくつかの並べ替えのカスタムパーサーを作成しなければならないのか、次のように私はsome_obj回復することができます。

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

これはYAMLのシリアライズでは動作しない場合は、JSONシリアライズして動作しますか?

答えて

1

あなたはYAMLパーサは、あなたが、本質的にawesome...\nを挿入し、明示的なエンド(yaml.dump(some_obj, stream, explicit_end=True)を()dummpと---\nawesome(文書の区切り文字を書くときに、それはまた、動作しない場合でも、完全なストリームを消費するため、あなたがやりたいことはできません) 。YAMLパーサーは単語awesomeが¹消費の両方あなたがyaml.load_all()を使用する場合と同様yaml.load()を使用する場合

あなたのような何かを考えることができますので、フロントまでの部分は、正常に動作します:。

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) 
(Python2に)与える

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

とファイルの内容は、次のとおり

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

Iは通常read()操作と組み合わせることはできません同様の技術が、for line in streamと行を読み取るを使用し、メタデータを含むYAMLヘッダーを持つファイル、通常のテキスト(インデントされていないので、emacsが正常に動作することができます)。


は、私はストリームの終わりマーカー(...)ので、私がしようとすると、次のリリースでこれを修正しますPythonのYAMLパーサのバグを過ぎて読んでみを¹しました。

関連する問題