【问题标题】:Generate YAML file from python with certain keys and values with double quotes使用带有双引号的某些键和值从 python 生成 YAML 文件
【发布时间】:2019-06-20 21:42:09
【问题描述】:

最近 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

注意在 access-points 下,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 文件。

【问题讨论】:

  • 我很确定 Python 2.7 或 3.x、ruamel.yaml、PyYAML 或 PySyck 都没有附带 YAML 模块(两者都只支持过时十年或更长时间的 YAML 版本前)。请提供参考(例如在 Python 存储库中)什么是*默认随 python 提供的 yaml 模块,以便我们知道您指的是什么。
  • @Anthon 你是对的。我刚刚做了一个“导入 yaml”,并假设 yaml 默认随 python 一起提供。这是不正确的。我将更新问题以反映这一点。我正在使用 PyYAML。

标签: python yaml


【解决方案1】:

在 YAML 中,除了特殊情况(如果字符串以特殊字符开头,如果它包含控制字符或 :<SPACE>),则不需要引用字符串。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 2019-02-24
    • 2019-05-05
    • 2018-05-12
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多