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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:43:13