Tags: #21912744)
from collections import OrderedDict
import yaml
import yamlordereddictloader
for data in yaml.load_all('foo: beep\nbar: 123\nbaz: 456'):
print data
# {'bar': 123, 'foo': 'beep', 'baz': 456}
datas = yaml.load(
'foo: beep\nbar: 123\nbaz: 456',
Loader=yamlordereddictloader.Loader
)
print datas
# OrderedDict([('foo', 'beep'), ('bar', 123), ('baz', 456)])
# Following works with safe_load
# And no need for external library `yamlordereddictloader`
def ordered_load(stream, loader=yaml.Loader, object_pairs_hook=OrderedDict):
class OrderedLoader(loader):
pass
def construct_mapping(loader, node):
loader.flatten_mapping(node)
return object_pairs_hook(loader.construct_pairs(node))
OrderedLoader.add_constructor(
yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
construct_mapping
)
return yaml.load(stream, OrderedLoader)
print ordered_load('foo: beep\nbar: 123\nbaz: 456', yaml.SafeLoader)
# OrderedDict([('foo', 'beep'), ('bar', 123), ('baz', 456)])