首页 > 解决方案 > 数组在 PyYAML 中没有缩进或空格

问题描述

在下面的代码中,我创建了net_plan_dict变量字典并将其转换为 YAML 格式文件。在字典中,我有一个名为的字段addresses,它是一个由三个元素组成的数组。创建 YAML 文件后,三个数组元素没有放在addressesfield 下:

import yaml

net_plan_dict = {
    'networking': {
        'addresses': ['192.168.1.1', '192.168.1.2', "192.168.1.3"],
        'gateway4': '192.168.121.1'
    }
}

with open("new.yaml", "w") as f:
    yaml.dump(net_plan_dict, f)

上面代码的输出如下(在下面的文件中,IP不在地址下面,也没有空格或缩进)。

新的.yaml:

networking:
  addresses:
  - 192.168.1.1 <-------- does not have indent
  - 192.168.1.2
  - 192.168.1.3
  gateway4: 192.168.121.1


但我的目标是获取此输出文件(如何创建此文件,当 ips 在地址字段下时):

networking:
  addresses:
    - 192.168.1.1
    - 192.168.1.2
    - 192.168.1.3
  gateway4: 192.168.121.1

标签: pythonpython-3.xpyyaml

解决方案


PyYAMLdump()没有对映射(2 个位置)和序列(4 个位置)进行不同缩进的精细控制,也不能-在(序列)缩进空间内偏移序列指示符( )。

如果你想对你的输出进行那种控制,你应该使用ruamel.yaml(免责声明:我是那个包的作者):

import sys
import ruamel.yaml


net_plan_dict = {
    'networking': {
        'addresses': ['192.168.1.1', '192.168.1.2', "192.168.1.3"],
        'gateway4': '192.168.121.1'
    }
}


yaml = ruamel.yaml.YAML()
yaml.indent(mapping=2, sequence=4, offset=2)
yaml.dump(net_plan_dict, sys.stdout)

这使:

networking:
  addresses:
    - 192.168.1.1
    - 192.168.1.2
    - 192.168.1.3
  gateway4: 192.168.121.1

推荐阅读