You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ruamel.yaml在Python中添加列表项时多余空行问题求助

解决ruamel.yaml添加列表项后出现多余空行并保留注释的问题

问题原因

原YAML文件中block1的最后一项- bbb后存在空行,ruamel.yaml会将这个空行解析为CommentToken('\n\n')并存储在对应CommentedSeq对象的ca.end属性中。当向列表追加新项时,这个空行注释会被保留,导致原有项与新项之间出现多余空行。

解决方案

在追加新项前,清理目标列表末尾的空行注释Token,同时保留其他注释内容。修改后的代码如下:

from ruamel.yaml import Yaml

def loader(my_yaml_file):
    yaml = Yaml()
    with open(my_yaml_file, "r", encoding="UTF-8") as file:
        return yaml.load(file)

def writer(data, my_yaml_file):
    yaml = Yaml()
    yaml.indent(mapping=2, sequence=4, offset=2)
    with open(my_yaml_file, "w", encoding="UTF-8") as file:
        yaml.dump(data, file)

def do_stuff():
    my_yaml_file = "file.yml"
    loaded_yaml = loader(my_yaml_file)
    block1_seq = loaded_yaml["block1"]
    
    # 清理列表末尾的空行注释
    if block1_seq.ca.end is not None and block1_seq.ca.end.value == '\n\n':
        block1_seq.ca.end = None
    
    block1_seq.append("ccc")
    writer(loaded_yaml, my_yaml_file)

验证结果

运行修改后的代码后,输出的YAML文件将符合期望格式:

name: someone

age: 100

# this is a comment
# and another

block1:
  - aaa
  - bbb
  - ccc

block2:
    sub:
      - 111
      - 222
      # a comment
      - 333

所有原有注释均被保留,block1中新增项与原有项之间无多余空行。

内容的提问来源于stack exchange,提问作者iSaWcH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 10:35:00