如何使用PyYaml或Ruamel.yaml仅转储带有flow_style的列表

问题描述

我具有以下内容

| prnt_id | sub_id | ac_nm    | cost  | units |
| ------- | ------ | -------- | ----- | ----- |
| 123     | abc01  | abc corp | 34500 | 24    |
| 456     | abc02  | xyz corp | 9800  | 10    |
| 856     | abc03  | jfk corp | 9820  | 12    |

当我使用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,2] 保持flow_style(就像使用valuesdefault_flow_style=None执行时一样,但保持default_flow_style=True的行为与使用{ {1}}。

有可能实现这一目标吗?

使用PyYAML 5.3.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)