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

时间:2017-06-01 17:44:53

标签: python yaml pyyaml ruamel.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

1 个答案:

答案 0 :(得分:3)

YAML 1.2中的null值(构建为Python的None)可以表示为nullNullNULL~ ,如指定here

Additionally

  

具有空内容的节点被解释为它们是具有空值的普通标量。这些节点通常被解析为“空”值。

因此,null值不会消失,使用null时,ruamel.yaml中的RoundTripDump的默认表示只会表示不同。如果您再次加载该输出,则再次获得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')

ruamel.yaml.RoundTripRepresenter.add_representer(type(None), my_represent_none)

data = ruamel.yaml.round_trip_load(yaml_str)
ruamel.yaml.round_trip_dump(data, sys.stdout)

将转储:

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

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