在 Python 中漂亮地将 2D 数组转储到 YAML



>假设我有一个 2D 数组,定义如下:

import sys
from ruamel.yaml import YAML
yaml = YAML()
yaml.version = (1,2)
def main():
    data = {
        "foo": [
            [1,2,3],
            [4,5,6]
        ]
    }
    yaml.dump(data, sys.stdout)
if __name__ == '__main__':
    main()

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

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

甚至

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

我已经研究了ruamel.yaml但默认行为是每列都在单独的行上,虽然有效,但不容易阅读:

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

将属性.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

最新更新