在 YAML 转储时保持源未格式化

keep source unformatted while YAML dump

我的 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 但我希望我的完整源代码未格式化。

如果你想保留你的来源,你最好的办法是跟踪是否有变化和 在没有更改的情况下不要覆盖源代码,如您的示例所示。

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

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

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

您可以做的另一件事是使用 .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