Я создаю файл yaml с именем main.yaml, но я хочу вывод следующим образом:
# example
Name:
Job: abcd
Addresss: xyz
client_id: 641
test: !include test.yaml # new key
Мне не нужны котировки на выходе. Итак, как предотвратить появление котировок на выходе?
------------------------------код----------
import sys
from pathlib import Path
from ruamel.yaml import YAML
from ruamel.yaml.scalarstring import SingleQuotedScalarString, DoubleQuotedScalarString
inp = """\
# example
Name:
Job: abcd
Addresss: xyz
client_id: 641
"""
opath2= Path('main.yaml')
with YAML(output=opath2) as yaml:
yaml.indent(sequence=4, offset=2)
code = yaml.load(inp)
code.insert(1, 'test', '!include test.yaml', comment="new key")
yaml.dump(code, sys.stdout)
------------------------------выход------------------- -----------
# example
Name:
Job: abcd
Addresss: xyz
client_id: 641
test: '!include test.yaml' # new key
Мне не нужны котировки на выходе. Итак, как предотвратить появление котировок на выходе?
В YAML строки могут быть только без кавычек, если они не имеют другого значения. 124
- это число, а не строка. true
является логическим, а не строковым. !foo
обозначает тег, а не строку. Таким образом, если вы хотите, чтобы строка без кавычек начиналась с восклицательного знака, вам не повезло, вы не можете сделать это в YAML.
Если вы действительно хотите вставить тег, как считает deceze, вам нужно сделать некоторую работу. Самое простое - фактически реализовать класс, который будет представлен таким образом.
import ruamel
class Include(ruamel.yaml.YAMLObject):
yaml_constructor = ruamel.yaml.RoundTripConstructor
yaml_representer = ruamel.yaml.RoundTripRepresenter
yaml_tag = '!include'
def __init__(self, file):
self.file = file
@classmethod
def from_yaml(cls, loader, node):
return cls(loader.construct_scalar(node))
@classmethod
def to_yaml(cls, dumper, data):
if isinstance(data.file, ruamel.yaml.scalarstring.ScalarString):
style = data.file.style # ruamel.yaml>0.15.8
else:
style = None
return dumper.represent_scalar(cls.yaml_tag, data.file, style=style)
(Бесстыдно скопировано из ruamel/_test/test_add_xxx.py
.) Тогда вы можете сделать
code.insert(1, 'test', Include('test.yaml'), comment="new key")