转储嵌套列表的 Ruamel yaml 格式
Ruamel yaml formatting of dumped nested lists
我想转储包含嵌套列表组件的字典,其中列表的每一行都独占一行。我也想维护字典顺序。
这是一个 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
第一种方法具有我想要的嵌套列表格式,但丢失了字典顺序。 (这并不奇怪,因为我没有使用往返转储器)第二种方法设法维持秩序,但失去了我想要的嵌套列表格式。每当我使用往返转储程序时,我都会丢失漂亮的嵌套列表格式。
这里有什么提示吗?
你的字典有你想要的顺序要么是运气好,要么是因为你使用的是 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()
的调用。
我想转储包含嵌套列表组件的字典,其中列表的每一行都独占一行。我也想维护字典顺序。
这是一个 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
第一种方法具有我想要的嵌套列表格式,但丢失了字典顺序。 (这并不奇怪,因为我没有使用往返转储器)第二种方法设法维持秩序,但失去了我想要的嵌套列表格式。每当我使用往返转储程序时,我都会丢失漂亮的嵌套列表格式。
这里有什么提示吗?
你的字典有你想要的顺序要么是运气好,要么是因为你使用的是 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()
的调用。