使用某些键和带双引号的值从python生成YAML文件

时间:2019-06-20 21:42:09

标签: python yaml

最近,Ubuntu已开始随netplan一起提供。它需要yaml配置来设置网络接口。因此,例如,它需要以下yaml才能设置WiFi:

network:
    version: 2
    renderer: NetworkManager
    wifis:
        interface_name:
            access-points:
                "apn":
                    password: "pwd"
            nameservers:
                addresses: [8.8.4.4, 8.8.8.8]
            dhcp4: true

关于访问点的注意事项,network_ssid_name(apn)和密码字段的值(pwd)用双引号引起来。

我四处查看堆栈溢出,发现this

但是,此解决方案要求从pip调用ruamel.yaml安装模块。我想使用我的python发行版中已经可用的PyYAML模块来实现此目的。

到目前为止,我尝试了一些方法:

import yaml

d = {'network': {'version': 2, 'renderer': 'NetworkManager', 'wifis':{'wlp58s0': {'access-points': {b'apn': {'password': b'pwd'}}}}}}


with open('/home/edyza/result.yml', 'w') as yaml_file:
    yaml.dump(d, yaml_file, default_flow_style=False, default_style=None)

此输出为

network:
  renderer: NetworkManager
  version: 2
  wifis:
    wlp58s0:
      access-points:
        apn:
          password: pwd

现在我尝试使用转义符和其他一些诸如

import yaml

d = {'network': {'version': 2, 'renderer': 'NetworkManager', 'wifis':{'wlp58s0': {'"access-points"': {'apn': {'password': "\"pwd\""}}}}}}

with open('/home/edyza/result.yml', 'w') as yaml_file:
    yaml.dump(d, yaml_file, default_flow_style=False, default_style=None)

然后输出更改为

network:
  renderer: NetworkManager
  version: 2
  wifis:
    wlp58s0:
      '"access-points"':
        apn:
          password: '"pwd"'

在不使用第三方模块的情况下,我可以进行哪些更改以在适当的键和值处用双引号引起所需的输出?

或者我应该考虑使用另一种方法来生成yaml文件。

1 个答案:

答案 0 :(得分:0)

在YAML中,除了特殊情况(字符串以特殊字符开头,包含控制字符或:<SPACE>的情况除外),都不需要用引号引起来。

作为参考,我可以推荐我的article on YAML quoting吗?

我认为netplan YAML解析器不太可能真的需要这些引号。 您是否尝试了不带引号的操作,并且收到错误消息?