YAML:词典的订单输出

时间:2018-10-06 00:13:38

标签: python yaml

我想将以下输出写入YAML文件:

'0':[]
'1':[]
'2':[]
'3':[]
...
'100':[]

我可以这样做:

import yaml
d = {str(i):[] for i in range(101)}
with open('result.yml', 'w') as yaml_file:
    yaml.dump(d, yaml_file, default_flow_style=False)

但是订单不会保留。如何获得所需的输出?

谢谢!

1 个答案:

答案 0 :(得分:0)

YAML定义映射键的顺序不得传达内容信息。因此,在使用YAML时,一定不要依赖于映射键的顺序。另请参见this discussion。如果您要执行的操作取决于键的顺序,则应使用列表,例如:

import yaml

d = [{str(i): []} for i in range(101)]
with open('result.yml', 'w') as yaml_file:
    yaml.dump(d, yaml_file, default_flow_style=False)

哪个给你:

- '0': []
- '1': []
- '2': []

保留键的顺序,因为您将键-值对包装在列表中。

如果您确实需要按照所需的顺序编写映射,则仍然可以使用低级事件API:

import yaml
from yaml.events import *

d = [StreamStartEvent(), DocumentStartEvent(),
     MappingStartEvent(anchor=None, tag=u'tag:yaml.org,2002:map', implicit=True)]
for i in range(101):
  d.extend([ScalarEvent(anchor=None, tag=u'tag:yaml.org,2002:str', value=str(i),
                       implicit=(True, True)),
            SequenceStartEvent(anchor=None, tag=u'tag:yaml.org,2002:seq', implicit=True),
            SequenceEndEvent()])
d.extend([MappingEndEvent(), DocumentEndEvent(), StreamEndEvent()])

with open('result.yml', 'w') as yaml_file:
  yaml.emit(d, yaml_file)