python - 从 yaml 文件中删除空对象

标签 python yaml ruamel.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"

---

---

我想使用 ruamel 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"

我尝试了下面的代码,它不起作用。

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
...

我怎样才能实现这个目标?谢谢!

最佳答案

您没有包含多个对象的 YAML 文件,而是包含多个 YAML 文档的文件。 加载此类文件的方法是使用 load_all() ,它返回一个生成器,返回 依次为每个文档的数据结构。

您可以将该生成器的输出转换为一个列表,您可能已经创建了该列表 您的 yaml_objects (但您的代码不完整,因此您可能正在做其他事情)。 但是然后迭代该列表的元素并从同一列表中删除项目,同时迭代, 导致问题。在您的情况下,也会发生这种情况,并且倒数第二个文档(因为它在您要删除的列表中移动)不会被删除并被转储为 --- null\n...。在这种情况下,我必须从列表中删除可能的多个元素,我通常会收集元素的索引 然后使用这些删除元素 索引以相反的顺序(希望原因显而易见)。

但是,在这种情况下,丢弃空的要容易得多 首先遍历生成器,同时遍历生成器:

import sys
import ruamel.yaml

file_in = Path('input.yaml')
file_out = Path('output.yaml')
    
with ruamel.yaml.YAML(output=file_out) as yaml:
    yaml.preserve_quotes = True
    for data in yaml.load_all(file_in):
        if data is not None:
            yaml.dump(data)

print(file_out.read_text())

给出:

apiVersion: v1
kind: Secret
metadata:
  name: secret1
type: Opaque
data:
  password: "password1234"

---

apiVersion: v1
kind: Secret
metadata:
  name: secret2
type: Opaque
data:
  password: "password5678"

如果您需要进一步处理加载的数据,您还可以将data附加到列表中 但前提是它不是 None:

yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True

documents = []
for data in yaml.load_all(file_in):
    if data is not None:
        documents.append(data)
for doc in documents:
    doc['apiVersion'] = 'v2'
yaml.dump_all(documents, sys.stdout)

给出:

apiVersion: v2
kind: Secret
metadata:
  name: secret1
type: Opaque
data:
  password: "password1234"

---

apiVersion: v2
kind: Secret
metadata:
  name: secret2
type: Opaque
data:
  password: "password5678"

关于python - 从 yaml 文件中删除空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75702971/

相关文章:

python - MySQLdb 没有用数据填充数据库中的行,但是 feildes 是自动递增的

python - 如何通过Python在yaml文件中的一个标签下添加一个列表

mypy - 将 Mypy 与 Ruamel.yaml 一起使用

python - 如何为 ruamel.yaml 创建自定义 yaml 映射转储程序?

python - 使用 Python 标准化 JSON

python - 良好的编码风格 : use temporary variable for list length or not?

python - 配置文件的跨平台寻址

bash - 如何简化 YAML CircleCI 配置以获得更好的可读性?

bash - 配置confixtx.yaml文件?

python - conda 包的 yaml 文件以编程方式更新