如何将YAML中结尾带冒号的元素加载为字符串而非字典?
解决YAML末尾带冒号的字符串被解析为字典的问题
YAML语法里,冒号:是键值对的分隔标记,当解析器碰到baz::时,会把baz:当成键,后续空内容当成值,所以解析成了{'baz:' : ''}——哪怕用BaseLoader也遵循这个语法逻辑,因此没效果。
下面提供两种解决思路:
方案1:修改YAML源文件(最简单)
给带冒号结尾的字符串包裹单引号或双引号,强制解析器将其识别为字符串:
foo: - bar - "baz::"
这样无论用哪种Loader加载,baz::都会被解析成字符串类型。
方案2:自定义Loader(无需修改源文件)
如果没法改动原YAML文件,可以自定义一个Loader,通过添加隐式解析规则,让末尾带::的内容被识别为字符串。示例代码:
import yaml class StringColonLoader(yaml.Loader): def __init__(self, stream): super().__init__(stream) # 添加隐式解析器,匹配以::结尾的字符串 self.add_implicit_resolver( 'tag:yaml.org,2002:str', r'^[^\s]+::$', list(':') ) # 使用自定义Loader加载文件 with open('your_yaml_file.yaml', 'r') as f: result = yaml.load(f, Loader=StringColonLoader) print(result) # 输出: {'foo': ['bar', 'baz::']}
内容的提问来源于stack exchange,提问作者Mike van Dyke
相关产品推荐
相关产品推荐

