有没有办法在使用ruamel.yaml加载的相同版本中转储YAML?

时间:2017-12-28 21:54:20

标签: yaml ruamel.yaml

使用.shopping将YAML文件转储到与加载的版本相同的版本中是否有好方法?如果我在文件中有ruamel.yaml指令,我希望能够在YAML 1.1中将文件转储回来,而不必硬编码%YAML 1.1

因此给出了一些数据,

version='1.1'

我希望避免在%YAML 1.1 --- is_string: 'on' is_boolean: on 上对version='1.1'进行硬编码,

round_trip_dump()

1 个答案:

答案 0 :(得分:1)

YAML文件的版本是一个稍纵即逝的值,在加载后会重置。我计划以某种方式加载最新文档的版本,但是在流中有多个文档需要更多的思考。

对于单个文档流,您可以执行以下操作以从指令中捕获版本。这都是使用新API完成的。使用您在示例中使用的旧API也可以,但更难,因为没有YAML()实例将属性附加到:

import sys
from ruamel.yaml import YAML
from ruamel.yaml.parser import Parser

yaml_str = """\
%YAML 1.1
---
is_string: 'on'
is_boolean: on
"""

class MyParser(Parser):
    def dispose(self):
        self.loader.last_yaml_version = self.yaml_version
        Parser.dispose(self)


yaml = YAML()
yaml.Parser = MyParser
data = yaml.load(yaml_str)

yaml2 = YAML()
yaml2.version = yaml.last_yaml_version
yaml2.dump(data, sys.stdout)

给出:

%YAML 1.1
---
is_string: 'on'
is_boolean: true

请注意,有必要为输出创建一个干净的新对象,因为当遇到yaml指令时,“无版本”读取不会完全重置%YAML 1.1实例。

也可以将与is_boolean相关联的值转储为on,但这会影响流中的所有布尔值。