【问题标题】:keep source unformatted while YAML dump在 YAML 转储时保持源未格式化
【发布时间】:2020-09-30 05:34:37
【问题描述】:

我的 YAML 文件如下所示:

info_block:
  enable: null
  start: "12:00"
  server_type: linux

我已使用ruamel.yaml.dump 加载和转储

但是,输出的格式如下:(如将 null 替换为空,从起始值中删除双引号)

info_block:
  enable:
  start: 12:00
  server_type: linux

我如何在此处保留我的来源

我知道有类似this 的东西可以保留null,但我希望我的完整源代码未格式化。

【问题讨论】:

    标签: yaml pyyaml ruamel.yaml


    【解决方案1】:

    如果您想保留您的来源,最好的办法是跟踪某些内容是否发生变化以及 如您的示例所示,在未更改时不要覆盖源代码。

    ruamel.yaml 将始终标准化输出,如果这不是您想要的, 您唯一的希望是对文件进行精确的字符串替换,可能 使用加载数据的行信息。我建议不要这样做, 如果你保留的是为了最小化差异,你应该只是字节子弹 一次,就像您在使用某些源格式化程序时所做的那样。

    但是,如果您只使用 YAML 1.1 解析器,尽管该版本是 10多年前更换了,我可以看到12:00而不是"12:00"可以 是一个问题,因为这些字符串被解释为六十进制。

    在 ruamel.yaml 中,您可以将输出设置为 YAML 1.1,然后12:00 将被引用,但您会得到一个文档标题,说明它符合 过时的版本。

    您可以做的另一件事是使用.preserve_quotes 属性保留所有引号:

    import sys
    import ruamel.yaml
    
    yaml_str = """\
    info_block:
      enable: null
      start: "12:00"
      server_type: linux
    """
    
    
    def my_represent_none(self, data):
        return self.represent_scalar(u'tag:yaml.org,2002:null', u'null')
    
    yaml = ruamel.yaml.YAML()
    yaml.representer.add_representer(type(None), my_represent_none)
    
    yaml.indent(mapping=2, sequence=2, offset=0)
    yaml.preserve_quotes = True
    
    data = yaml.load(yaml_str)
    
    yaml.dump(data, sys.stdout)
    

    如果与空节点的替代表示器结合使用,则提供完整的保留版本:

    info_block:
      enable: null
      start: "12:00"
      server_type: linux
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-24
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多