【问题标题】:Ruamel yaml formatting of dumped nested lists转储嵌套列表的 Ruamel yaml 格式
【发布时间】:2017-08-21 22:58:44
【问题描述】:

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

这是一个 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 python-3.x ruamel.yaml


    【解决方案1】:

    你的字典有你想要的顺序要么是运气,要么是因为你使用的是 Python 3.6。在较旧版本的 Python(即

    如果您只针对 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 的约束
    猜你喜欢
    • 1970-01-01
    • 2021-02-19
    • 2021-12-17
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    相关资源
    最近更新 更多