【问题标题】:Searching and writing in YAML file with python使用python在YAML文件中搜索和写入
【发布时间】:2021-12-05 02:01:42
【问题描述】:

我有一个 YAML 文件,它在一个文件中有多个文档。

type: ABC
api_version: v3
metadata:
  created_by: xxx
  name: cccc
namespace: zzz
spec:
  check_hooks: none
  command: bbbbb
---
type: ABC
api_version: v3
metadata:
  labels:
    aaaa.io: xxx
  created_by: me
  name: xxx
namespace: aaaa
spec:
  check_hooks: null
  command: qqqq
  1. 我要读取文件
  2. 然后我想在“标签”对象下再添加一个键值对
  3. 如果标签对象不在元数据下,我想添加“标签”,然后在下面添加 键值对

我有这段代码来加载多文档文件

with open(filepath) as stream:
    for data in yaml.safe_load_all(stream):          
        print(data)

我能够在控制台中读取文件并打印 dict 对象。我不确定下一步该做什么。我正在使用 ruamel.yaml 库。

【问题讨论】:

  • 您应该使用标签ruamel.yaml 标记有关 ruamel.yaml 的问题,以便订阅该标签的人自动收到通知。

标签: python yaml ruamel.yaml


【解决方案1】:

您正在使用 ruamel.yaml 的旧的、已弃用的 API,您真的不应该 一个新程序。假设您的 YAML 在文件 input.yaml 中:

import sys
from pathlib import Path
import ruamel.yaml

in_file = Path('input.yaml')
    
yaml = ruamel.yaml.YAML()

insert_labels_at_front = True
labels = 'labels'

key = 'mykey'
val = 'myvalue'

all_docs = []
for data in yaml.load_all(in_file):
    if 'metadata' in data:
        md = data['metadata']
        if labels not in md:
            if insert_labels_at_front:
                md.insert(0, labels, {key, val})
            else:
                md[labels] = {key: val}
    all_docs.append(data)

yaml.dump_all(all_docs, sys.stdout)  # replace sys.stdout with some output Path() instance

给出:

type: ABC
api_version: v3
metadata:
  labels: !!set
    mykey:
    myvalue:
  created_by: xxx
  name: cccc
namespace: zzz
spec:
  check_hooks: none
  command: bbbbb
---
type: ABC
api_version: v3
metadata:
  labels:
    aaaa.io: xxx
  created_by: me
  name: xxx
namespace: aaaa
spec:
  check_hooks:
  command: qqqq

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 2021-07-07
    • 2014-03-12
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    相关资源
    最近更新 更多