ruamel.yaml往返解析后注释后出现空行问题求助
解决ruamel.yaml往返解析后注释后多出空行的问题
当使用ruamel.yaml解析并重新生成YAML文件时,行内注释和文件头注释后会自动添加空行,破坏原文件格式。以下是针对性的解决方法:
核心原因
ruamel.yaml中的每个注释对象(CommentToken)默认设置end_of_line=True,会在注释后强制添加换行,导致多余空行出现。只需将该属性改为False即可解决问题。
单场景处理代码
如果只需处理示例中的文件头注释和指定key的行内注释,可使用以下代码:
from pathlib import Path import ruamel.yaml input_path = Path("input.yaml") yaml = ruamel.yaml.YAML() data = yaml.load(input_path) # 移除文件头注释后的空行 if yaml.comments and yaml.comments.top_comments: for comment in yaml.comments.top_comments: comment.end_of_line = False # 移除key行内注释后的空行 if 'key' in data.ca.items: inline_comment = data.ca.items['key'][2] if inline_comment: inline_comment.end_of_line = False yaml.dump(data, Path("someoutput.yaml"))
批量递归处理代码
如果YAML文件有多层级结构或大量注释,可通过递归遍历批量处理所有注释:
from pathlib import Path import ruamel.yaml from ruamel.yaml.comments import CommentedMap, CommentedSeq def fix_comment_newlines(obj): # 处理映射类型节点 if isinstance(obj, CommentedMap): for key in obj.ca.items: inline_comment = obj.ca.items[key][2] if inline_comment: inline_comment.end_of_line = False # 递归处理子节点 for val in obj.values(): fix_comment_newlines(val) # 处理序列类型节点 elif isinstance(obj, CommentedSeq): for idx in obj.ca.items: inline_comment = obj.ca.items[idx][2] if inline_comment: inline_comment.end_of_line = False # 递归处理子节点 for item in obj: fix_comment_newlines(item) input_path = Path("input.yaml") yaml = ruamel.yaml.YAML() data = yaml.load(input_path) # 处理文件头注释 if yaml.comments and yaml.comments.top_comments: for comment in yaml.comments.top_comments: comment.end_of_line = False # 递归处理所有行内注释 fix_comment_newlines(data) yaml.dump(data, Path("someoutput.yaml"))
内容的提问来源于stack exchange,提问作者SeekerN
相关产品推荐
相关产品推荐

