首页 > 解决方案 > 如何使用 PyYaml 或 Ruamel.yaml 仅转储带有 flow_style 的列表

问题描述

我有以下内容:

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

当我将这个字典转储到 YAML 时,default_flow_style=True我得到了以下内容:

>>> 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]

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

有可能实现这一目标吗?

使用 PyYAML 5.3.1

标签: pythonyamlpyyamlruamel.yaml

解决方案


如果不更改作为转储程序一部分的表示器,则无法使用 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)


推荐阅读