ruamel.yaml 0.17.16-1版本dump时数组前带注释致首元素格式异常
问题原因
这不是配置错误,是Ubuntu软件源提供的ruamel.yaml 0.17.16-1版本自带的bug:当数组(序列)正前方存在注释、且数组元素为换行书写的键值对(块式映射)时,注释关联的格式状态标记没有被正确重置,导致数组第一个元素内的多个键值对被错误压缩到同一行输出。
这个bug和注释的缩进位置无关,只要数组前紧邻注释就会触发,和观察到的现象完全吻合。
解决方法
根据实际环境限制二选一即可:
- 升级ruamel.yaml版本:不要使用apt源提供的旧版本,通过pip安装0.17.20及以上版本的ruamel.yaml即可,新版本已经修复了这个注释关联序列项的格式问题,现有的
indent、compact配置不需要做任何修改,直接运行原有代码就能输出正确格式。 - 无法升级版本时加临时规避逻辑:如果服务器环境限制不能随意升级软件包,可以在加载完YAML数据后,手动清除数组首项上错误绑定的注释标记,修改后的完整代码如下:
import sys import ruamel.yaml yaml_str = """\ top_level: # comment - key1: "1" key4: "4" - key2: "2" key5: "5" """ yaml = ruamel.yaml.YAML() yaml.indent(mapping=2, sequence=4, offset=2) yaml.compact(seq_map=False) data = yaml.load(yaml_str) # 适配0.17.16版本:清除首项错误绑定的注释标记 if hasattr(data['top_level'], 'ca'): data['top_level'].ca.items.pop(0, None) yaml.dump(data, sys.stdout)
运行后即可得到符合预期的输出:
top_level: # comment - key1: '1' key4: '4' - key2: '2' key5: '5'
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

