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

如何在Python中将YAML内容以字符串形式存入YAML键?

解决PyYAML保存ConfigMap时多行字符串变为YAML对象的问题

问题原因

当你用yaml.dump()将修改后的内部YAML结构转为字符串,再赋值给ConfigMap的data.config字段后,直接dump整个ConfigMap时,PyYAML默认不会将带换行的字符串以|的literal block格式输出,而是会将其解析展开为YAML层级结构,导致原有的多行字符串格式丢失。

解决方案

通过自定义字符串的YAML表示器(representer),强制让包含换行的字符串以|格式输出,同时修正文件保存的语法错误:

1. 定义自定义字符串表示器

添加以下代码,让PyYAML对包含换行的字符串使用|的literal block格式:

import yaml

def str_presenter(dumper, data):
    # 若字符串包含换行,用|格式输出
    if '\n' in data:
        return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|')
    # 普通字符串正常输出
    return dumper.represent_scalar('tag:yaml.org,2002:str', data)

# 注册自定义表示器
yaml.add_representer(str, str_presenter)

2. 修改并保存ConfigMap

使用以下完整代码读取、修改并保存ConfigMap,确保格式正确:

import yaml

def str_presenter(dumper, data):
    if '\n' in data:
        return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|')
    return dumper.represent_scalar('tag:yaml.org,2002:str', data)

yaml.add_representer(str, str_presenter)

# 读取并修改ConfigMap
with open("conf-configmap.yaml", 'r') as f:
    config_map = yaml.safe_load(f)
    # 解析内部的config字符串为YAML
    inner_config = yaml.safe_load(config_map['data']['config'])
    # 修改内部属性
    inner_config['images']['generator'] = "gcr.io/xxx/xxx/generator:v0.0.2"

# 将修改后的内部YAML转为字符串,保留块格式
config_map['data']['config'] = yaml.dump(inner_config, default_flow_style=False)

# 保存回原文件
with open("conf-configmap.yaml", 'w') as f:
    yaml.dump(config_map, f, default_flow_style=False)

效果验证

保存后的ConfigMap会保持原有的格式,data.config仍为|开头的多行字符串:

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-string-configmap
data:
  config: |
    timeout: 20m
    images:
      generator: "gcr.io/xxx/xxx/generator:v0.0.2"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:42:51