如何在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
相关产品推荐
相关产品推荐

