在 yaml 文件中添加多个文档 | pyyaml

Ahs*_*eem 5 python yaml pyyaml python-3.x

我正在处理一个对象,其中首先 python 读取 YAML,进行一些更改,然后将它们写回文件。加载和更新值部分工作正常,但是当我编写文件时,它会列出相当独立的文档。

测试.yaml

apiVersion: v1
data:
  databag1: try this
  databag2: then try this
kind: ConfigMap
metadata:
  name: data bag info
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: data-bag-service
  name: data-bag-tagging
Run Code Online (Sandbox Code Playgroud)

代码块

import yaml
with open("./testing.yaml", "r") as stream:
    deployment_dict= list(yaml.safe_load_all(stream))

print(deployment_dict)
with open("./testing.yaml", "w") as service_config:
    yaml.dump(
        deployment_dict,
        service_config,
        default_flow_style=False
    )
Run Code Online (Sandbox Code Playgroud)

我得到的转换: testing.yaml

- apiVersion: v1
  data:
    databag1: try this
    databag2: then try this
  kind: ConfigMap
  metadata:
    name: data bag info
- apiVersion: extensions/v1beta1
  kind: Deployment
  metadata:
    labels:
      app: data-bag-service
    name: data-bag-tagging
Run Code Online (Sandbox Code Playgroud)

如何使用---指令结束指示符达到原始状态?

Edg*_*gón 7

根据文档

如果您需要将多个 YAML 文档转储到单个流中,请使用函数yaml.dump_all. yaml.dump_all接受一个列表或一个生成器

yaml.dump_all(
    deployment_dict,
    service_config,
    default_flow_style=False
)
Run Code Online (Sandbox Code Playgroud)

您仍然需要default_flow_style=False获取块样式输出。

示例代码:

import yaml


with open("./testing.yaml", "r") as stream:
    d = list(yaml.safe_load_all(stream))

d.append(d[-1])

with open("./testing2.yaml", "w") as stream:
    yaml.dump_all(
        d,
        stream,
        default_flow_style=False
    )
Run Code Online (Sandbox Code Playgroud)

测试2.yaml

apiVersion: v1
data:
  databag1: try this
  databag2: then try this
kind: ConfigMap
metadata:
  name: data bag info
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: data-bag-service
  name: data-bag-tagging
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: data-bag-service
  name: data-bag-tagging
Run Code Online (Sandbox Code Playgroud)