Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python ruamel YAML保持YAML文件的偏移缩进_Python_Yaml_Ruamel.yaml - Fatal编程技术网

使用python ruamel YAML保持YAML文件的偏移缩进

使用python ruamel YAML保持YAML文件的偏移缩进,python,yaml,ruamel.yaml,Python,Yaml,Ruamel.yaml,我试图使用ruamel yaml来实现以下目标:我有一个yaml文件,其中包含一组变量,如下所示(请注意,所有键都以缩进6开头): 应用程序: 版本:'最新' 环境:“测试” #认证 验证端点:'http://localhost/login' 身份验证令牌:23NSDQD94NFDFKF0SQS 我的想法是为用户提供一个python脚本,该脚本将生成配置文件,但会覆盖值,因此基本上我将解析参数,加载YAML文件更改值,并使用更新的值转储YAML文件,这一切都可以正常工作,但转储文件时会丢失缩进

我试图使用ruamel yaml来实现以下目标:我有一个yaml文件,其中包含一组变量,如下所示(请注意,所有键都以缩进6开头):

应用程序:
版本:'最新'
环境:“测试”
#认证
验证端点:'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月以来,这一数字一直在上升