我有一个 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/