PyYAML无法解析含块字面量(|)的YAML文件,求解决建议
解决PyYAML解析含Markdown块字面量的YAML文件报错问题
你遇到的问题本质是YAML语法不符合规范,PyYAML对块字面量(|)的格式要求很严格,咱们一步步来解决:
1. 错误原因分析
你写的YAML里,product name: | Azure big VM这种写法是不合法的。YAML规定,块字面量符号|后面必须紧跟换行,然后在下一行缩进内容(缩进层级要和其他键值对保持一致)。如果直接在|后面跟内容,解析器会把整个| Azure big VM当成无效的语法标记,从而抛出解析错误。
2. 修正YAML格式(最直接的解决办法)
把含|的行改成标准的块字面量格式即可:
--- product name: | Azure big VM product version: 1.0.0 Operating System: RHEL disk type: premium ssd location: uk-south
如果你的Markdown块有多行内容,只要保持统一缩进就行:
product name: | # Azure big VM 这是一款高性能的云虚拟机,支持: - 超大内存 - 高IO磁盘
3. 替代方案:使用更兼容的YAML解析库
如果经常需要处理复杂的YAML(比如含Markdown块、YAML 1.2语法),推荐使用ruamel.yaml,它对YAML规范的支持比PyYAML更完善,处理块字面量更稳定。
安装依赖
pip install ruamel.yaml
示例脚本
from ruamel.yaml import YAML # 初始化安全加载器(避免安全风险) yaml = YAML(typ='safe') with open('single-source.yaml', 'r', encoding='utf-8') as file: documentation = yaml.load(file) print(documentation)
4. 额外注意事项
- 永远不要在生产环境中使用
yaml.load()而不指定安全加载器(比如yaml.FullLoader),这会有代码注入的安全风险,推荐使用yaml.safe_load()或者上面提到的ruamel.yaml的安全模式。 - 如果需要保留块字面量的换行符,
|会保留末尾的换行;如果想去掉末尾换行,可以用|-;如果想保留所有换行(包括末尾空行),用|+。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

