转义嵌套列表的Ruamel yaml格式

时间:2017-08-21 07:43:07

标签: python python-3.x ruamel.yaml

我想转储一个包含嵌套列表的组件的字典,其中列表的每一行都在它自己的行上。我也想保持字典顺序。

这是一个MWE:

import sys

from ruamel import yaml
from ruamel.yaml import YAML

d = {'b':1,
     'a':[[1, 2],[3, 4]]}

# desired output:
# b: 1
# a:
# - [1, 2]
# - [3, 4]

print()
yaml.dump(d, sys.stdout)
print('\n')
YAML().dump(d, sys.stdout)

这就是我实际得到的:

a:
- [1, 2]
- [3, 4]
b: 1


b: 1
a:
- - 1
  - 2
- - 3
  - 4

第一种方法有我想要的嵌套列表格式,但是丢失了字典顺序。 (这并不奇怪,因为我没有使用往返式转储器)第二种方法设法维护顺序,但失去了我想要的嵌套列表格式。任何时候我使用往返翻车机,我都失去了漂亮的嵌套列表格式。

这里有任何提示吗?

1 个答案:

答案 0 :(得分:1)

你的字典有你想要的顺序要么运气好,要么就是因为你使用的是Python 3.6。在旧版本的Python(即<3.6)中,不保证这个顺序。

如果您只定位到3.6并拥有ruamel.yaml>=0.15.32,则可以执行以下操作:

import sys

from ruamel import yaml
from ruamel.yaml import YAML


d = {'b':1,
     'a':[[1, 2],[3, 4]]}

y = YAML()
y.default_flow_style = None
y.dump(d, sys.stdout)

如果你有旧版本和Python 3.6:

import sys

from ruamel import yaml
from ruamel.yaml import YAML

y = YAML()

d = {'b':1,
     'a':[y.seq([1, 2]),y.seq([3, 4])]}


for seq in d['a']:
    seq.fa.set_flow_style()
y.dump(d, sys.stdout)

得到:

b: 1
a:
- [1, 2]
- [3, 4]

要在旧版本的Python中获得您想要的顺序,您应该这样做:

d = y.map()
d['b'] = 1
d['a'] = y.seq([1, 2]),y.seq([3, 4])

ruamel.yaml>=0.15.32您可以忽略对y.seq()的调用。