Вы явно не заявляете об этом, но из-за использования yaml.load()
и получения этого результата, я предполагаю, что вы используете PyYAML. Вы не должны использовать PyYAML yaml.load()
, поскольку это потенциально небезопасно и совершенно не нужно .Если вам нужно придерживаться PyYAML, используйте yaml.safe_load()
.
В последней версии YAML] ((1.2 выпущена в 2009 году) базовая схема того, что считается как int изменено по сравнению с предыдущей версией (1.1 из 2005). Наиболее заметные различия заключаются в том, что 077
больше не является восьмеричным в YAML 1.2 (используйте 0o77
) и что sexagesimals ,в документации YAML 1.1, указанной этим правилом проверки:
|[-+]?[1-9][0-9_]*(:[0-5]?[0-9])+ # (base 60)
больше не поддерживается в YAML 1.2 (не явно, а спецификация YAML 1.2 указывает на независимый от языка тип 1.1, но пример был удалениз документа).
В документации YAML 1.1 явными примерами шестнадцатеричных чисел являются 190:20:30
, соответственно 3:25:45
.¹целое число, за которым следует два набора (двухзначных) чисел, разделенных двумя двоеточиями (:
), которые могут использоваться для указания, например, часов, минут и секунд. Однако правило (регулярное выражение) имеетнет ограничений толькоy два из этих наборов как +
в конце (:[0-5]?[0-9])+
означают как минимум один раз и не имеют ограничений.В шестнадцатеричном формате между двоеточиями вы можете иметь либо однозначное число от 0-9
, либо двухзначное число, где первое ограничено 0-5
.
PyYAML документировано иметь синтаксический анализатор YAML 1.1 (поэтому он не был обновлен, хотя YAML 1.2 вышел в 2009 году).Он будет читать ваши MAC-адреса как шестнадцатеричные, если они соответствуют правилу, что примерно соответствует случаю, когда число между двоеточиями или после последнего двоеточия меньше 60 , как это происходит для обоих значений для ключа MAC1
и MAC2
(значения одинаковы) в значении для NETWORK2
.Другие MAC-адреса имеют :86:
и не являются шестнадцатеричными числами.
Если вы сбросите эти MAC-адреса из строки, используя PyYAML, они при необходимости приведут их в кавычки:
import sys
import yaml
d = dict(mac1='84:19:14:15:86:58', mac2='80:41:26:53:24:11')
yaml.safe_dump(d, sys.stdout)
, который выдает:
{mac1: '84:19:14:15:86:58', mac2: '80:41:26:53:24:11'}
Обратите внимание, что я не сделал print(safe_dump(d))
специально, это медленнее (поскольку он должен сначала создать и заполнить внутренний буфер, извлечь и вывести содержимое),Он также добавляет дополнительный пустой символ новой строки в конце вывода.
Вы, конечно, можете указать все (или все необходимые) MAC-адреса, но более простой способ - это обновить до синтаксического анализатора YAML 1.2, например ruamel.yaml
пакет (отказ от ответственности: я являюсь автором этого пакета).Что, предполагая, что ваш ввод в network.yaml
, может быть сделано с помощью:
import sys
import ruamel.yaml as yaml
with open('network.yaml') as fp:
data = yaml.safe_load(fp)
print(data)
, что дает:
{'NETWORK1': {'BOND_MODE': 4, 'BOND_NAME': 'bond0', 'MAC1': '84:19:14:15:86:58', 'MAC2': '84:19:14:15:86:59'}, 'NETWORK2': {'BOND_MODE': 1, 'BOND_NAME': 'bond0', 'BLAN_ID': 820, 'MAC1': '80:41:26:53:24:11', 'MAC2': '80:41:26:53:24:11'}}
В режиме туда-обратно, с использованием более нового API, ruamel.yaml не будет вставлять кавычки при выгрузке, так как они не нужны для YAML 1.2:
import sys
import ruamel.yaml
from pathlib import Path
network_file = Path('network.yaml')
yaml = ruamel.yaml.YAML()
# yaml.indent(mapping=4, sequence=4, offset=2)
# yaml.preserve_quotes = True
data = yaml.load(network_file)
yaml.dump(data, sys.stdout)
для результата:
NETWORK1:
BOND_MODE: 4
BOND_NAME: bond0
MAC1: 84:19:14:15:86:58
MAC2: 84:19:14:15:86:59
NETWORK2:
BOND_MODE: 1
BOND_NAME: bond0
BLAN_ID: 820
MAC1: 80:41:26:53:24:11
MAC2: 80:41:26:53:24:11
¹ Вы также можете иметь шестнадцатеричное значение с плавающей запятой: 20:30.15