从包含特殊字符(星号、符号、*、&)的 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 管道中保留这些内容。
我有一个 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 管道中保留这些内容。