【问题标题】:How to dump only lists with flow_style with PyYaml or Ruamel.yaml如何使用 PyYaml 或 Ruamel.yaml 仅转储带有 flow_style 的列表
【发布时间】:2023-03-21 17:23:02
【问题描述】:

我有以下内容:

data = {"values": list(range(3)),'some_key': {'value': 2, 'unit': 'm'}}

当我使用 default_flow_style=True 将此 dict 转储到 YAML 时,我得到以下内容:

>>> print(yaml.dump( data, default_flow_style=False))
some_key:
  unit: m
  value: 2
values:
- 0
- 1
- 2

>>> print(yaml.dump( data, default_flow_style=True))
{some_key: {unit: m, value: 2}, values: [0, 1, 2]}

>>> print(yaml.dump( data, default_flow_style=None))
some_key: {unit: m, value: 2}
values: [0, 1, 2]

我想转储这个字典,保留 values 和 flow_style(就像使用 default_flow_style=Nonedefault_flow_style=True 执行时一样,但保持 some_key 的行为与使用 default_flow_style=False 时完全相同。

有可能实现吗?

使用 PyYAML 5.3.1

【问题讨论】:

    标签: python yaml pyyaml ruamel.yaml


    【解决方案1】:

    如果不更改作为转储程序一部分的表示器,您将无法使用 PyYAML 实现该目标。

    在 ruamel.yaml 中,您可以将节点标记为以流模式转储,然后将“下面”的所有内容也转储为流模式(必须如此):

    import sys
    import ruamel.yaml
    
    def flist(x):
        retval = ruamel.yaml.comments.CommentedSeq(x)
        retval.fa.set_flow_style()  # fa -> format attribute
        return retval
    
    data = {"values": flist(range(3)),'some_key': {'value': 2, 'unit': 'm'}}
    
    yaml = ruamel.yaml.YAML()
    yaml.dump(data, sys.stdout)
    

    给出:

    values: [0, 1, 2]
    some_key:
      value: 2
      unit: m
    

    你首先得到 values 键,因为它在 data 的定义中是第一个(假设你使用的是最新的 Python 3)

    【讨论】:

      猜你喜欢
      • 2021-01-10
      • 1970-01-01
      • 2017-07-15
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 2021-05-20
      相关资源
      最近更新 更多