使用python ruamel YAML保持YAML文件的偏移缩进
我试图使用ruamel yaml来实现以下目标:我有一个yaml文件,其中包含一组变量,如下所示(请注意,所有键都以缩进6开头):使用python ruamel YAML保持YAML文件的偏移缩进,python,yaml,ruamel.yaml,Python,Yaml,Ruamel.yaml,我试图使用ruamel yaml来实现以下目标:我有一个yaml文件,其中包含一组变量,如下所示(请注意,所有键都以缩进6开头): 应用程序: 版本:'最新' 环境:“测试” #认证 验证端点:'http://localhost/login' 身份验证令牌:23NSDQD94NFDFKF0SQS 我的想法是为用户提供一个python脚本,该脚本将生成配置文件,但会覆盖值,因此基本上我将解析参数,加载YAML文件更改值,并使用更新的值转储YAML文件,这一切都可以正常工作,但转储文件时会丢失缩进
应用程序:
版本:'最新'
环境:“测试”
#认证
验证端点:'http://localhost/login'
身份验证令牌:23NSDQD94NFDFKF0SQS
我的想法是为用户提供一个python脚本,该脚本将生成配置文件,但会覆盖值,因此基本上我将解析参数,加载YAML文件更改值,并使用更新的值转储YAML文件,这一切都可以正常工作,但转储文件时会丢失缩进6,除注释外,(见下面的代码)
应用程序:
版本:'最新'
环境:“测试”
#认证
验证端点:'http://localhost/login'
身份验证令牌:23NSDQD94NFDFKF0SQS
现在这个缩进很重要,因为这个文件将被解析并合并到一个更大的YAML文件中
def更新_yaml(文件):
yaml=ruamel.yaml.yaml()
yaml.缩进(映射=6)
config_yaml=yaml.load(文件)
#为可读性而指定的值更改代码
打开(os.path.join(sys.path[0],“config.yml”),“w”)作为文件:
dump(config_yml,文件)
我尝试了一些使用缩进方法的方法,但都没有效果,你知道如何保持这个原始缩进吗?首先,并非所有键的缩进都是6,如图所示 键
version
和env
,它们是作为
根级别键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
您应该设置。保留_quotes
,因为一些(坏的)解析器不喜欢URL中的冒号未加引号,
将其解释为值指示器,即使后面没有空格
您必须为注释做一些特殊的事情,因为在往返过程中,它知道它最初出现在哪个列中,并将尝试在那里恢复(除非某些值更改使其正确)
自2006年9月以来,这一数字一直在上升