ruamel.yaml解析带注释YAML时注释关联错位如何解决
解决方案
1. 修复版本bug(推荐)
你遇到的IndexError是ruamel.yaml 0.17.16版本的已知问题,该版本的C_PRE注释模式存在索引校验逻辑缺陷,升级到0.17.21及以上版本即可解决:
pip install --upgrade ruamel.yaml>=0.17.21
升级后使用如下配置即可实现你需要的注释绑定效果:
from ruamel.yaml import YAML from ruamel.yaml.constructor import C_PRE y = YAML(typ='rt') y.comment_handling = C_PRE
该模式会自动将键之前的独立行注释绑定为对应键的前置注释,行尾注释保留在原键的尾注释位置,不会和后续注释合并,完全符合你期望的绑定规则。
2. 低版本兼容处理
如果受环境限制无法升级版本,可以手动拆分被错误合并的注释,重新绑定到对应键:
from ruamel.yaml import YAML y = YAML(typ='rt') with open('你的文件路径.yaml', encoding='utf-8') as f: data = y.load(f) # 拆分b的尾注释,将B1注释绑定到b1的前置注释 b_eol_comment = data['b'].ca.comment[2] if b_eol_comment: comment_lines = b_eol_comment.value.splitlines(keepends=True) # 保留b自己的尾注释 data['b'].ca.comment[2].value = comment_lines[0] if len(comment_lines) > 1: # 剩余行绑定为b1的前置注释 data['b']['b1'].ca.comment[1] = [ type(b_eol_comment)(line) for line in comment_lines[1:] ] # 拆分b2的尾注释,将C注释绑定到c的前置注释 b2_eol_comment = data['b']['b2'].ca.comment[2] if b2_eol_comment: comment_lines = b2_eol_comment.value.splitlines(keepends=True) data['b']['b2'].ca.comment[2].value = comment_lines[0] if len(comment_lines) > 1: data['c'].ca.comment[1] = [ type(b2_eol_comment)(line) for line in comment_lines[1:] ]
调整完成后再做键排序操作即可,排序全程要保留CommentedMap类型,不要转成普通Python字典,否则注释会全部丢失。
内容的提问来源于stack exchange,提问作者Tander
相关产品推荐
相关产品推荐

