从包含特殊字符(星号、符号、*、&)的 python 字典写入 YAML 文件

Write YAML file from python dict containing special characters (asterisk, ampersand, *, &)

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

我遇到的问题是有些参数前面有特殊字符($、&):例如*target_size。

当我在 python 中使用字典时,此参数是字符串格式的字典值 ('*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)

不带引号的星号(*)和符号(&)是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 模块在 deserialization/serialization 管道中保留这些内容。