Controlling Yaml Serialization Order in Python

后端 未结 4 1002
渐次进展
渐次进展 2020-12-15 08:42

How do you control how the order in which PyYaml outputs key/value pairs when serializing a Python dictionary?

I\'m using Yaml as a simple serialization format in a

相关标签:
4条回答
  • 2020-12-15 08:45

    The last time I checked, Python's dictionaries weren't ordered. If you really want them to be, I strongly recommend using a list of key/value pairs.

    [
        ('key', 'value'),
        ('key2', 'value2')
    ]
    

    Alternatively, define a list with the keys and put them in the right order.

    keys = ['key1', 'name', 'price', 'key2'];
    for key in keys:
        print obj[key]
    
    0 讨论(0)
  • 2020-12-15 08:56

    New Solution (as of 2020 and PyYAML 5.1)

    You can dump a dictionary in its current order by simply using

    yaml.dump(data, default_flow_style=False, sort_keys=False)
    
    0 讨论(0)
  • 2020-12-15 09:04

    Took me a few hours of digging through PyYAML docs and tickets, but I eventually discovered this comment that lays out some proof-of-concept code for serializing an OrderedDict as a normal YAML map (but maintaining the order).

    e.g. applied to my original code, the solution looks something like:

    >>> import yaml
    >>> from collections import OrderedDict
    >>> def dump_anydict_as_map(anydict):
    ...     yaml.add_representer(anydict, _represent_dictorder)
    ... 
    >>> def _represent_dictorder( self, data):
    ...     if isinstance(data, Document):
    ...         return self.represent_mapping('tag:yaml.org,2002:map', data.__getstate__().items())
    ...     else:
    ...         return self.represent_mapping('tag:yaml.org,2002:map', data.items())
    ... 
    >>> class Document(object):
    ...     def __init__(self, name):
    ...         self.name = name
    ...         self.otherstuff = 'blah'
    ...     def __getstate__(self):
    ...         d = OrderedDict()
    ...         d['name'] = self.name
    ...         d['otherstuff'] = self.otherstuff
    ...         return d
    ... 
    >>> dump_anydict_as_map(Document)
    >>> doc = Document('obj-20111227')
    >>> print yaml.dump(doc, indent=4)
    !!python/object:__main__.Document
    name: obj-20111227
    otherstuff: blah
    
    0 讨论(0)
  • 2020-12-15 09:10

    I think the problem is when you dump the data. I looked into the code of PyYaml and there is a optional argument called sort_keys, setting that value to False seems to do the trick.

    0 讨论(0)
提交回复
热议问题