【问题标题】:Write YAML file from python dict containing special characters (asterisk, ampersand, *, &)从包含特殊字符(星号、与号、*、&)的 python dict 写入 YAML 文件
【发布时间】:2020-04-23 21:05:43
【问题描述】:

我有一个 YAML 文件,我需要将其导入 python,以某种方式对其进行处理,然后再次导出为 YAML 文件。更准确地说,我将 YAML 配置文件作为 dict 导入,生成许多带有更改参数的文件,然后再次将它们全部写入 YAML 文件。

我面临的问题是参数前面有特殊字符($、&):例如*目标大小。

当我在 python 中使用 dict 时,此参数是字符串格式 ('*target_size') 的字典值。当我写这个字典时,因为 YAML 文件格式得到保留,即 '*target_size' 在生成的 YAML 文件中被引号包围。我需要的只是 *target_size,与原始文件中的相同。

我查看了 pyYaml 文档和其他资源,但没有找到解决方案。

编写 YAML 文件的代码:

    with open(f'{PATH}/base_config.yml', 'w') as outfile:
         yaml.dump(config, outfile, default_flow_style=False, sort_keys=False)

【问题讨论】:

    标签: python dictionary yaml config pyyaml


    【解决方案1】:

    不带引号的星号 (*) 和 & 符号 (&) 是 YAML 中的特殊字符,代表 aliases and anchors。这些让 YAML 文档的一部分引用 YAML 文档的另一部分。

    当您将 YAML 文档反序列化为 Python 数据结构时,您会丢失有关原始文档中存在的锚点和别名的任何信息。

    当您将 Python 数据结构序列化为 YAML 时,yaml 模块将在适当的地方自动生成锚点和别名来表示自引用数据结构。例如,鉴于此:

    >>> import yaml
    >>> doc = {'a': {'example': 'this is a test'}}
    >>> doc['b'] = doc['a']
    >>> print(yaml.safe_dump(doc))
    

    我们看到以下输出:

    a: &id001
      example: this is a test
    b: *id001
    

    您将无法使用标准 Python yaml 模块在反序列化/序列化管道中保留这些内容。

    【讨论】:

    • 哦,我明白了,现在很清楚了。将尝试以另一种方式做这件事。谢谢!
    • 如果您不希望pyyaml Dumper 使用别名和锚点,您可以在使用 Dumper 之前执行 Dumper.ignore_aliases = lambda self, data: True
    猜你喜欢
    • 2021-01-18
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 2018-05-22
    相关资源
    最近更新 更多