【问题标题】:Is there a way to dump YAML in same version it was loaded in with ruamel.yaml?有没有办法在使用 ruamel.yaml 加载的相同版本中转储 YAML?
【发布时间】:2025-12-16 23:55:01
【问题描述】:

ruamel.yaml 有没有一种好方法可以将 YAML 文件转储到与加载时相同的版本中?如果我在文件中有 %YAML 1.1 指令,我希望能够在 YAML 1.1 中转储文件,而无需硬编码 version='1.1'

所以给定一些数据,例如,

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

我想避免在round_trip_dump() 上硬编码version='1.1'

x = f.read()
d = round_trip_load(x)
round_trip_dump(d, f, explicit_start=True)

【问题讨论】:

    标签: yaml ruamel.yaml


    【解决方案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 1.1 指令时,“未版本化”读取不会完全重置 yaml 实例。

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

    【讨论】: