【问题标题】:How to keep yaml Format when using yaml.SafeDumper使用yaml.SafeDumper时如何保持yaml格式
【发布时间】:2023-02-24 03:41:02
【问题描述】:

我有一个 YAML 文件

Version: "1.0"
title1: "Title 1"
title2: [Title 2]

我使用打开文件

def open_file(input_file):
    with open(input_file, encoding="utf8") as file:
        return_file = yaml.safe_load(file)
        return return_file

在运行时它看起来像这样:

{'Version': '1.0', 'title1': 'Title 1', 'title2': ['Title 2']}

我收到的输出是:

Version: "1.0"
title1: Title 1
title2:
- Title 2

如何保留“title1”和“title2”的原始格式?

我这样写文件:

    with open(output_file_name, "w", encoding="utf8") as dump_file:
        yaml.dump(<runtime_file>, dump_file, Dumper=MyDumper, sort_keys=False, allow_unicode=True)

class MyDumper(yaml.SafeDumper):
    def write_line_break(self, data=None):
        super().write_line_break(data)
        if len(self.indents) == 1:
            super().write_line_break()
        if len(self.indents) == 2:
            super().write_line_break()

【问题讨论】:

    标签: python yaml pyyaml


    【解决方案1】:

    您正在使用 PyYAML,它仅支持 YAML 1.1(的一个子集),而 YAML 1.2 已发布超过 13 个 几年前。你应该升级到ruamel.yaml(免责声明:我是作者)从2014年开始开发 专门保留原始布局、引号、cmets、锚点/别名、数字格式等。

    import sys
    import ruamel.yaml
    from pathlib import Path
    
    file_in = Path('input.yaml')
    file_out = Path('output.yaml')
        
    yaml = ruamel.yaml.YAML()
    # yaml.indent(mapping=4, sequence=4, offset=2) 
    yaml.preserve_quotes = True
    data = yaml.load(file_in)
    yaml.dump(data, file_out)
    
    print(file_out.read_text())
    

    这使:

    Version: "1.0"
    title1: "Title 1"
    title2: [Title 2]
    

    由于您的某些标量字符串被多余地引用而其他人则没有,因此您 在 PyYAML 中无法轻松实现这一点。您必须将引用的字符串加载到 与未引用的类不同,因此它们会作为原件转储。 根据您需要对这些加载的数据执行的操作,您需要使这些类表现良好 大多像一个普通的字符串。为此,您需要深入了解 PyYAML 的内部结构。 ruamel.yaml需要 为您处理所有这些(在默认的往返模式下)。

    【讨论】:

      猜你喜欢
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      相关资源
      最近更新 更多