在Python中将2D数组清楚地转储到YAML

时间:2019-01-14 18:42:14

标签: python yaml ruamel.yaml

假设我有一个这样定义的2D数组:

"foo":
- [1,2,3]
- [4,5,6]

我想输出一个“可读”,有效的YAML文件,每个“行”放在单独的行上:

"foo": [
  [1,2,3],
  [4,5,5]
]

甚至

ruamel.yaml

我研究了%YAML 1.2 --- foo: - - 1 - 2 - 3 - - 4 - 5 - 6 ,但是默认行为是每一行都位于单独的行上,尽管有效,但不容易阅读:

{{1}}

1 个答案:

答案 0 :(得分:2)

将属性.default_flow_style设置为None(而不是默认值False)时, 您的叶节点将以流样式表示:

import sys
import ruamel.yaml


yaml = ruamel.yaml.YAML()
yaml.version = (1,2)
yaml.default_flow_style = None

def main():
    data = {
        "foo": [
            [1,2,3],
            [4,5,6]
        ]
    }
    yaml.dump(data, sys.stdout)

if __name__ == '__main__':
    main()

给出:

%YAML 1.2
---
foo:
- [1, 2, 3]
- [4, 5, 6]

但是以上内容适用于整个文件。

如果要在YAML中将单个列表表示为流样式序列,则可以 应该将它们设置为CommentedSeq类型,然后您可以设置属性每个对象。 这也是ruamel.yaml“知道”往返时如何保留序列样式的方式:

import sys
import ruamel.yaml

yaml = ruamel.yaml.YAML()
yaml.version = (1,2)

a = ruamel.yaml.comments.CommentedSeq([1,2,3])
a.fa.set_flow_style()


def main():
    data = {
        "foo": [
        a,
            [4,5,6]
        ]
    }
    yaml.dump(data, sys.stdout)

if __name__ == '__main__':
    main()

给予:

%YAML 1.2
---
foo:
- [1, 2, 3]
- - 4
  - 5
  - 6