2017-08-21 35 views
1

我想转储一个包含嵌套列表的组件的字典,其中列表的每一行都在其自己的行上。我也想维护字典顺序。转储嵌套列表的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 

第一种方法嵌套列表格式我想要的,但失去字典顺序。 (没有意外,因为我没有使用往返自卸车)第二种方法设法维持秩序,但失去了我想要的嵌套列表格式。任何时候我使用往返自卸车,我都失去了很好的嵌套列表格式。

这里的任何提示?

回答

0

你的字典有你想要的顺序是好运还是因为你使用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()