我想转储一个包含嵌套列表的组件的字典,其中列表的每一行都在它自己的行上。我也想保持字典顺序。
这是一个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 :(得分: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()
的调用。