Прежде всего, неверно, что все ваши ключи имеют отступ 6, как ключи version
и env
, которые являются частью сопоставления, являющегося значением для ключа уровня root app
, имеют только две позиции с отступом .
ruamel.yaml
приведет к тому, что ваш вывод будет соответствовать отступам. Все сопоставления будут иметь одинаковый отступ, а также все последовательности (хотя сопоставления и последовательности могут отличаться). Поскольку требуемый вывод не является согласованным, вам необходимо выполнить некоторую постобработку:
import sys
import ruamel.yaml
yaml_str = """\
app:
version: 'latest'
env: 'test'
#auth
auth_endpoint: 'http://localhost/login'
auth_token: 23NSDQD94NFDFKF0SQS
"""
class PushRootLeft:
def __init__(self, positions=42):
self.positions = positions
def __call__(self, s):
result = []
for line in s.splitlines(True):
sline = line.strip()
if not sline or sline[0] == '#':
result.append(line)
else:
result.append(' ' * self.positions + line)
return ''.join(result)
yaml = ruamel.yaml.YAML()
yaml.indent(mapping=2) # not necessary, this is the default
yaml.preserve_quotes = True
data = yaml.load(yaml_str)
print('123456780') # just to better see the alignment of the actual YAML output
yaml.dump(data, sys.stdout, transform=PushRootLeft(6))
, что даст:
123456780
app:
version: 'latest'
env: 'test'
#auth
auth_endpoint: 'http://localhost/login'
auth_token: 23NSDQD94NFDFKF0SQS
Вам следует установить .preserve_quotes
как некоторое ( не разбирается) синтаксический анализатор не любит двоеточие в вашем URL без кавычек, интерпретировать его как индикатор значения, даже если за ним не стоит пробел.
То, что вы должны сделать что-то особенное для комментариев, это потому, что при -trip знает, в каком столбце он изначально появился, и попытается восстановить его (если только какое-то изменение значения не подтолкнет его правильно).
Рекомендуемое расширение для файлов YAML .yaml
с сентября 2006 г.