ruamel.yaml加载转储后丢失方括号列表注释的解决办法咨询
问题:ruamel.yaml保留流格式列表(方括号)中的注释失败
原始YAML文件:
org-lists: ea-orgs: [ 1, # test-org ] ga-orgs: [ 2, # customer-2 3, # customer-3 4, # customer-4 ]
使用以下ruamel.yaml代码加载并转储后,注释被完全移除:
import ruamel.yaml def format_yaml(filename: str) -> None: yaml = ruamel.yaml.YAML() yaml.preserve_quotes = True yaml.indent(mapping=2, sequence=4, offset=2) with open(filename, "r") as file: data = yaml.load(file) with open(filename, "w") as file: yaml.dump(data, file)
尝试改为块式列表时注释可保留,但更偏好方括号的流格式;同时试过设置yaml.default_flow_style = None,问题依旧。
解决方案
ruamel.yaml对**流格式序列(方括号形式)**的注释支持存在局限:流格式序列加载后会被解析为普通序列对象,注释无法自动绑定到元素上。要保留方括号形式同时保住注释,可通过以下方法实现:
方法一:手动绑定注释并强制流格式
使用ruamel.yaml的CommentedSeq类,为每个序列元素手动添加注释,再强制序列以流格式输出:
import ruamel.yaml from ruamel.yaml.comments import CommentedSeq def format_yaml(filename: str) -> None: yaml = ruamel.yaml.YAML() yaml.preserve_quotes = True yaml.indent(mapping=2, sequence=4, offset=2) with open(filename, "r") as file: data = yaml.load(file) # 处理ea-orgs序列:绑定注释+强制流格式 ea_seq = CommentedSeq(data['org-lists']['ea-orgs']) ea_seq.yaml_set_comment_before_after_key(0, after=' test-org') ea_seq.fa.set_flow_style() data['org-lists']['ea-orgs'] = ea_seq # 处理ga-orgs序列:逐个元素绑定注释+强制流格式 ga_seq = CommentedSeq(data['org-lists']['ga-orgs']) ga_seq.yaml_set_comment_before_after_key(0, after=' customer-2') ga_seq.yaml_set_comment_before_after_key(1, after=' customer-3') ga_seq.yaml_set_comment_before_after_key(2, after=' customer-4') ga_seq.fa.set_flow_style() data['org-lists']['ga-orgs'] = ga_seq with open(filename, "w") as file: yaml.dump(data, file)
执行后输出的YAML会保留方括号格式和注释,格式可能略有调整(比如换行),但核心内容符合需求。
方法二:自定义序列表示器(不推荐)
若需批量处理大量流格式序列,可自定义ruamel.yaml的序列表示器,但该方法需要修改库的内部逻辑,维护成本高,且容易引发兼容性问题,仅在特殊场景下使用。
内容的提问来源于stack exchange,提问作者chicken gyoza
相关产品推荐
相关产品推荐

