使用Python修复YAML缩进问题(CloudFormation场景)
解决CloudFormation YAML资源复制时的缩进层级问题
问题根源
你原代码的问题出在手动拼接资源名称行,然后直接dump单个资源对象。PyYAML处理单个资源的键(比如DeletionPolicy、Properties)时,会默认把它们作为顶级键输出,你手动加的4个空格根本没法让这些键嵌套到资源名称的层级下,最终导致格式混乱。
正确实现方式
要让PyYAML帮你处理好所有缩进层级,得把单个资源包装成字典再dump,再调整外层缩进适配Resources:的层级。结合@Michael的思路,优化后的代码如下:
import yaml import textwrap # 假设rscItem是当前处理的资源名,entrypath是原模板路径,resourcename是输出文件名 with open(entrypath, 'r') as magic: yaml_object = yaml.load(magic, Loader=yaml.SafeLoader) with open(f'{resourcename}_Restore.yaml', 'a+') as s: # 把单个资源包装成{资源名: 资源内容}的字典,让PyYAML自动处理内部嵌套 resource_block = {rscItem: yaml_object['Resources'][rscItem]} # dump时指定indent=2,保证资源内部字段的缩进正确 raw_yaml = yaml.safe_dump(resource_block, default_flow_style=False, indent=2) # 给整个资源块加2个空格缩进,让它归属于Resources节点 indented_yaml = textwrap.indent(raw_yaml, ' ') s.write(indented_yaml) # 加空行分隔不同资源,可读性更好 s.write('\n')
为什么这能解决问题
- 包装资源字典:把单个资源放到以资源名为键的字典里,PyYAML dump时会自动把
DeletionPolicy、Properties等字段嵌套在资源名称下方,确保内部层级正确。 - 统一缩进配置:
indent=2让资源内部的每个子字段相对于资源名称缩进2个空格,符合YAML的标准缩进规范。 - 外层缩进适配:
textwrap.indent给整个资源块再加2个空格,让它正好嵌套在Resources:下面,和你期望的格式完全匹配。
最终效果
运行这段代码后,生成的YAML格式会和你想要的一致:
Resources: defaulteventbus: DeletionPolicy: Retain Properties: Name: default Tags: [] Type: AWS::Events::EventBus UpdateReplacePolicy: Retain LambdaEventSourceMapping: DeletionPolicy: Retain Properties: BatchSize: 1 BisectBatchOnFunctionError: true DestinationConfig: OnFailure: Destination: Ref: SNSTopicName Enabled: true
内容的提问来源于stack exchange,提问作者soBusted
相关产品推荐
相关产品推荐

