Создайте файл YAML из python с определенными ключами и значениями с двойными кавычками

Недавно Ubuntu начал поставляться с netplan. Требовались конфиги yaml для настройки сетевых интерфейсов. Так, например, для настройки WiFi требуется следующий yaml:

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) заключены в двойные кавычки.

Я посмотрел на переполнение стека и нашел это

Однако это решение требует установки модуля из pip call ruamel.yaml. Я хочу добиться этого с помощью модуля PyYAML, который уже доступен в моем дистрибутиве Python.

Вот некоторые вещи, которые я пробовал до сих пор:

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

Теперь я попытался использовать escape-символы и некоторые другие вещи, такие как

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.


person A Saxena    schedule 20.06.2019    source источник
comment
Я почти уверен, что ни один модуль YAML не поставляется с Python 2.7 или 3.x, ни ruamel.yaml, ни PyYAML, ни PySyck (оба из которых поддерживают только версии YAML, которые устарели десять или более лет назад). Пожалуйста, предоставьте ссылки (например, в репозитории Python) на то, что будет *модулем yaml, который поставляется по умолчанию с python`, чтобы мы знали, о чем вы говорите.   -  person Anthon    schedule 23.06.2019
comment
@ Антон, ты прав. Я только что сделал импорт yaml и предположил, что yaml поставляется по умолчанию с python. Это неправильно. Я обновлю вопрос, чтобы отразить это. Я использую PyYAML.   -  person A Saxena    schedule 24.06.2019


Ответы (1)


В YAML заключать строки в кавычки не нужно, за исключением особых случаев (если строка начинается со специального символа, если она содержит управляющие символы или :<SPACE>).

Для справки могу ли я порекомендовать мой статья о цитировании YAML?

Я думаю, маловероятно, что синтаксический анализатор netplan YAML действительно требует этих кавычек. Вы пробовали без кавычек и получили ошибку?

person tinita    schedule 16.07.2019