用ruamel yaml保留YAML的结构

丹尼尔

我一直在使用ruamel yaml编辑我的YAML文件并将其转回。我需要帮助来了解如何保持与原始文件相同的结构,因为我要做的就是复制,编辑并再次写入。

例如,这是原始文件:

    ElasticLoadBalancingV2Listener:
        Type: "AWS::ElasticLoadBalancingV2::Listener"
        Properties:
            LoadBalancerArn: !Ref ElasticLoadBalancingV2LoadBalancer
            Port: !FindInMap [NLBPorts, Port1, Port]
            Protocol: "TCP"
            DefaultActions:
              -
                Order: 1
                TargetGroupArn: !Ref ElasticLoadBalancingV2TargetGroup1
                Type: "forward"

新文件看起来不一样:

    ElasticLoadBalancingV2Listener:
        Type: "AWS::ElasticLoadBalancingV2::Listener"
        Properties:
            LoadBalancerArn: !Ref ElasticLoadBalancingV2LoadBalancer
            Port: !FindInMap [NLBPorts, Port1, Port]
            Protocol: "TCP"
            DefaultActions:
            -  Order: 1
               TargetGroupArn: !Ref ElasticLoadBalancingV2TargetGroup1
               Type: "forward"

最大的问题是,我使用了ruamel必须解决的各种技巧,但是每次yaml的不同部分都会中断。

这是我的功能:

def editEndpointServiceTemplate(endpoint_service_template_path):
    yaml = YAML()
    yaml.preserve_quotes = True
    # yaml.compact(seq_seq=False, seq_map=False)
    # yaml.indent(mapping=4, sequence=3, offset=0)

    #Load yaml file
    with open(endpoint_service_template_path) as fp:
        data = yaml.load(fp)
    
    #Edit the yaml
    data['Description'] = "CloudFormation"

    #Write new yaml file
    with open(endpoint_service_template_path, 'w') as fp:
        yaml.dump(data, fp)

正如您在注释命令中看到的那样,我修改了设置,但找不到最佳位置。

安通

在这种情况下,很明显您的函数没有产生您当前显示的输出(缩进不同,单词“ CloudFormation”缺失),但是通常您应该注意以下问题:程序是相同的,并且程序是完整的,因此可以得到结果可以更容易地复制。

ruamel.yaml没有为所有很少见的格式内置函数,但是您的方法相对接近于使用该方法的输出,.indent(mapping=4, sequence=4, offset=2)并通过逐行检查进行转换。

由于使用字符串标量的可能性较小,因此您需要一个序列指示符后接三个空格(“ - ”)(另外,还必须将其包装成一行以成为行上的第一个非空格),因此最好进行以下.indent(mapping=4, sequence=4, offset=0)转换:

import sys
import ruamel.yaml

yaml_str = """\
ElasticLoadBalancingV2Listener:
    Type: "AWS::ElasticLoadBalancingV2::Listener"
    Properties:
        LoadBalancerArn: !Ref ElasticLoadBalancingV2LoadBalancer
        Port: !FindInMap [NLBPorts, Port1, Port]
        Protocol: "TCP"
        DefaultActions:
          -
            Order: 1
            TargetGroupArn: !Ref ElasticLoadBalancingV2TargetGroup1
            Type: "forward"
"""

yaml = ruamel.yaml.YAML()
yaml.indent(mapping=4, sequence=4, offset=0)
yaml.preserve_quotes = True
data = yaml.load(yaml_str)
data['Description'] = "CloudFormation"

def break_seq(s):
    result = []
    PAT = '-   '
    for line in s.splitlines():
        ls_line = line.lstrip()
        if ls_line.startswith(PAT):
            line = line.replace(PAT, '  - \n' + ' ' * (line.index(PAT) + 4))
        result.append(line)
    return '\n'.join(result)

yaml.dump(data, sys.stdout, transform=break_seq)

这使:

ElasticLoadBalancingV2Listener:
    Type: "AWS::ElasticLoadBalancingV2::Listener"
    Properties:
        LoadBalancerArn: !Ref ElasticLoadBalancingV2LoadBalancer
        Port: !FindInMap [NLBPorts, Port1, Port]
        Protocol: "TCP"
        DefaultActions:
          - 
            Order: 1
            TargetGroupArn: !Ref ElasticLoadBalancingV2TargetGroup1
            Type: "forward"
Description: CloudFormation

可以通过“破解”序列化到序列中的例程来完成上述操作,但是,尽管在时间/空间使用上效率不高,但仅转换输出通常会更容易。

除非使用此输出的程序使用了不完整的YAML解析器,否则加载的实际数据结构不会改变,对于那些不习惯这种格式的人来说,其可读性会降低。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用ruamel yaml保留YAML的结构

来自分类Dev

使用ruamel.yaml格式化时,只保留带有注释的YAML文件吗?

来自分类Dev

使用 ruamel.yaml 删除最后一个 dict 键时保留以下注释

来自分类Dev

通过Python和ruamel.yaml模块编辑YAML文件

来自分类Dev

使用 ruamel.yaml 更新包含多个 yaml 的 yaml 文件中的 yaml 块

来自分类Dev

使用ruamel.yaml添加引号

来自分类Dev

如何使用ruamel.yaml添加节点

来自分类Dev

Ruamel yaml 导入不起作用

来自分类Dev

用PHP阅读Yaml

来自分类Dev

用正则表达式替换yaml结构中的版本

来自分类Dev

如何在ruamel yaml中定义新词典的样式?

来自分类Dev

在ruamel from_yaml中使用construct_undefined

来自分类Dev

如何使用python和ruamel更新此Yaml文件?

来自分类Dev

如何离线安装 ruamel.yaml python 库?

来自分类Dev

如何在python中使用ruamel.yaml从YAML文件中获取评论?

来自分类Dev

包含属性的python类的ruamel.yaml转储似乎会产生意外的yaml格式

来自分类Dev

在Python3中使用ruamel.yaml解析Yaml嵌套配置

来自分类Dev

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

来自分类Dev

将yaml转储到变量,而不是使用ruamel.yaml在stdout中将其流式传输

来自分类Dev

如何使用ruamel.yaml来正确设置YAML流样式转储?

来自分类Dev

使用ruamel.yaml加载YAML时,将别名复制到单独的Python对象

来自分类Dev

ccorp-ruamel-yaml-include在Python中包括YAML的基本用法

来自分类Dev

将Python列表显示为块样式yaml文件(ruamel.yaml)中的流样式

来自分类Dev

我们可以在不使用 ruamel.yaml 的情况下将旧 YAML 的内容复制到新 YAML 吗

来自分类Dev

转储已解析的文档时,是否可以保留YAML块结构?

来自分类Dev

用红宝石迭代Yaml数组

来自分类Dev

我可以在ruamel.yaml的CommentedMap中插入一行吗?

来自分类Dev

为什么单引号引起来PyYAML和ruamel.yaml会转义特殊字符?

来自分类Dev

如何从ruamel.yaml dump的输出中删除2个空格?

Related 相关文章

  1. 1

    用ruamel yaml保留YAML的结构

  2. 2

    使用ruamel.yaml格式化时,只保留带有注释的YAML文件吗?

  3. 3

    使用 ruamel.yaml 删除最后一个 dict 键时保留以下注释

  4. 4

    通过Python和ruamel.yaml模块编辑YAML文件

  5. 5

    使用 ruamel.yaml 更新包含多个 yaml 的 yaml 文件中的 yaml 块

  6. 6

    使用ruamel.yaml添加引号

  7. 7

    如何使用ruamel.yaml添加节点

  8. 8

    Ruamel yaml 导入不起作用

  9. 9

    用PHP阅读Yaml

  10. 10

    用正则表达式替换yaml结构中的版本

  11. 11

    如何在ruamel yaml中定义新词典的样式?

  12. 12

    在ruamel from_yaml中使用construct_undefined

  13. 13

    如何使用python和ruamel更新此Yaml文件?

  14. 14

    如何离线安装 ruamel.yaml python 库?

  15. 15

    如何在python中使用ruamel.yaml从YAML文件中获取评论?

  16. 16

    包含属性的python类的ruamel.yaml转储似乎会产生意外的yaml格式

  17. 17

    在Python3中使用ruamel.yaml解析Yaml嵌套配置

  18. 18

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

  19. 19

    将yaml转储到变量,而不是使用ruamel.yaml在stdout中将其流式传输

  20. 20

    如何使用ruamel.yaml来正确设置YAML流样式转储?

  21. 21

    使用ruamel.yaml加载YAML时,将别名复制到单独的Python对象

  22. 22

    ccorp-ruamel-yaml-include在Python中包括YAML的基本用法

  23. 23

    将Python列表显示为块样式yaml文件(ruamel.yaml)中的流样式

  24. 24

    我们可以在不使用 ruamel.yaml 的情况下将旧 YAML 的内容复制到新 YAML 吗

  25. 25

    转储已解析的文档时,是否可以保留YAML块结构?

  26. 26

    用红宝石迭代Yaml数组

  27. 27

    我可以在ruamel.yaml的CommentedMap中插入一行吗?

  28. 28

    为什么单引号引起来PyYAML和ruamel.yaml会转义特殊字符?

  29. 29

    如何从ruamel.yaml dump的输出中删除2个空格?

热门标签

归档