Python 转储嵌套列表的Ruamel yaml格式
我想转储一个包含嵌套列表组件的字典,其中列表的每一行都在自己的行上。我还想维持字典的秩序 这里有一个MWE:Python 转储嵌套列表的Ruamel yaml格式,python,python-3.x,ruamel.yaml,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) prin
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
第一个方法具有我想要的嵌套列表格式,但失去了字典顺序。(这并不奇怪,因为我没有使用往返转储程序)第二种方法设法维持顺序,但丢失了所需的嵌套列表格式。每当我使用往返转储程序时,我都会丢失良好的嵌套列表格式
这里有什么提示吗?您的字典的顺序是您运气好,或者因为您使用的是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()
如果数据来自一个包含许多列表格式的文件,比如[[1,2],[3,4]?不确定你在问什么,所以最好发布一个真正的问题。当使用默认的往返解析器时,每个序列(和映射)都被加载到一个结构中,该结构知道它是流样式还是块样式。如果有大量的操作(即,在流样式中永远不能有块样式映射/序列),这些将被转储回原样,当然没有YAML的约束