ruamel.yaml导出YAML时首行出现多余短横线与缩进如何解决
问题根因
你导出的YAML多了首行短横线和全局缩进,核心原因是待导出的每个deployment对象本身就是列表类型:
- 调用
load_all加载单文档YAML返回的是迭代器,转列表后结构为[实际的YAML配置字典] - 你在
define_exp_parameters函数中深拷贝的是整个列表,不是列表里的配置字典,因此最终待导出的每个对象都是[{配置}]格式的列表,ruamel.yaml导出列表时自然会生成短横线和对应缩进。
修复方案
核心逻辑修正
修改define_exp_parameters函数,只拷贝列表中的实际配置对象,不要拷贝整个加载得到的列表;同时初始化ruamel.yaml实例时添加preserve_quotes=True参数,保证原有单引号格式不丢失,再补全文件保存的路径、写入模式等疏漏即可。
修复后完整代码
import copy import ruamel.yaml from ruamel.yaml.scalarstring import (DoubleQuotedScalarString as dq, SingleQuotedScalarString as sq) def define_exp_parameters(deployments): deployment_list = [] # 取出load_all得到的列表里的实际配置对象 base_config = deployments[0] for duration in range(30, 71, 1): for cpu_cores in range(1, 4): # 深拷贝基础配置,不是整个列表 new_config = copy.deepcopy(base_config) new_config['spec']['annotationCheck'] = 'true' # 这里可按需添加duration、cpu_cores对应的配置修改逻辑 deployment_list.append(new_config) return deployment_list # 初始化时添加preserve_quotes=True保留原有引号格式 testyaml = ruamel.yaml.YAML() testyaml.preserve_quotes = True testyaml.default_flow_style = False template_dir = "替换为你的模板文件实际路径.yaml" save_base_dir = "替换为你的导出目录实际路径" with open(template_dir, 'r', encoding='utf-8') as read_file: deployments = testyaml.load_all(read_file) deployments = list(deployments) deployments = define_exp_parameters(deployments) for idx, deployment in enumerate(deployments, start=1): # 拼接导出文件路径,添加写入模式 save_path = f"{save_base_dir}/deployment_{idx}.yaml" with open(save_path, 'w', encoding='utf-8') as created_file: # 直接dump单个配置字典,不会生成多余的短横线和缩进 testyaml.dump(deployment, created_file)
修改后导出的YAML会完全匹配原模板的格式,不会出现多余的首行短横线和缩进,同时原有显式单引号会被保留。
内容的提问来源于stack exchange,提问作者oHanafi
相关产品推荐
相关产品推荐

