如何用ruamel.yaml删除YAML文件中的空对象?
使用ruamel.yaml删除YAML中的空文档对象
问题场景
我有一个包含多个YAML文档的文件,其中存在由连续---分隔的空文档,示例如下:
apiVersion: v1 kind: Secret metadata: name: secret1 type: Opaque data: password: "password1234" --- --- apiVersion: v1 kind: Secret metadata: name: secret2 type: Opaque data: password: "password5678" --- ---
需要删除所有空文档,得到如下目标格式:
apiVersion: v1 kind: Secret metadata: name: secret1 type: Opaque data: password: "password1234" --- apiVersion: v1 kind: Secret metadata: name: secret2 type: Opaque data: password: "password5678"
错误尝试
我尝试了以下代码,但处理后生成的文件出现异常(缺失第一个文档的apiVersion,且末尾出现--- null):
for y in yaml_objects: if y == None: yaml_objects.remove(y)
异常输出:
kind: Secret metadata: name: secret1 type: Opaque data: password: "password1234" --- apiVersion: v1 kind: Secret metadata: name: secret2 type: Opaque data: password: "password5678" --- null ...
解决方案
问题出在遍历列表时直接修改原列表会导致迭代异常,且未正确处理ruamel.yaml的文档加载/写入逻辑。正确的做法是在加载文档时过滤空对象,再重新写入:
完整代码
from ruamel.yaml import YAML # 初始化YAML处理器,保留原始引号格式 yaml = YAML() yaml.preserve_quotes = True # 读取并过滤空文档 with open('input.yaml', 'r') as input_file: # 用列表推导式过滤掉所有解析为None的空文档 valid_docs = [doc for doc in yaml.load_all(input_file) if doc is not None] # 写入处理后的结果 with open('output.yaml', 'w') as output_file: yaml.dump_all(valid_docs, output_file)
代码说明
- 使用
yaml.load_all()加载多文档,返回的迭代器中,空文档会被解析为None,通过列表推导式直接过滤掉这些None元素,避免迭代时修改原列表的问题。 preserve_quotes=True确保输出的YAML保留原始的引号格式,和示例一致。yaml.dump_all()会自动为多个文档添加正确的---分隔符,不会生成多余的null或缺失字段的问题。
处理后的文件将完全符合目标格式,所有空文档被彻底移除。
内容的提问来源于stack exchange,提问作者cttrader
相关产品推荐
相关产品推荐

