如何在通过ruamel.yaml转储时在yaml文件中保留空值



我有 YAML 文件site.yaml

Kvm_BLOCK:
ip_address: 10.X.X.X
property: null
server_type: zone

加载然后倾倒:

ruamel.yaml.dump(site_yaml, new_file, Dumper=ruamel.yaml.RoundTripDumper)

它变成了

Kvm_BLOCK:
ip_address: 10.X.X.X
property: 
server_type: zone

如何在属性块中保留此null

YAML 1.2 中的null值(构造为 Python 的None)可以表示为nullNullNULL~,如此处所述。

此外:

具有空

内容的节点被解释为具有空值的普通标量。此类节点通常解析为"null"值。

因此,您的null值并没有消失,只是在使用RoundTripDump时,ruamel.yamlnull的默认表示形式以不同的方式表示。如果再次加载该输出,则会再次获得一个None作为键的值property


如果这不符合您的喜好,您可以通过以下方式更改所有None/null值的输出:

import sys
import ruamel.yaml

yaml_str = """
Kvm_BLOCK:
ip_address: 10.X.X.X
property: null
server_type: zone
"""

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)
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)

这将转储:

Kvm_BLOCK:
ip_address: 10.X.X.X
property: NULL
server_type: zone

你可以通过在Python中创建不同的类(NULLNullnull等)来获得更精细的控制,并且每个类都有不同的表示器(与ruamel.yaml.scalarstring.py中的string子类用于以不同的方式表示字符串的方式大致相同(双引号,单引号,文字块样式标量)。问题是你不能子类化NoneType所以这不像字符串标量那样容易透明地完成。

最新更新