【问题标题】:how to add new tag value to a exiting yaml file using python如何使用 python 将新标签值添加到现有的 yaml 文件
【发布时间】:2023-02-02 20:13:01
【问题描述】:

我想在 yaml 内容下面添加额外的标签值。

基础 Yaml

infra:
  etcd:
    container:
      replica_count: 3
      resource:
        limit_memory: 1000Mi
        limit_cpu: 1000m
        requests_memory: 1000Mi
        requests_cpu: 1000m
    volume:
      storageClaim: 5Gi
      storageCapacity: 5Gi
  kafka:
    container:
      replica_count: 3
      resource:
        limit_memory: 2000Mi
        limit_cpu: 1000m
        requests_memory: 2000Mi
        requests_cpu: 1000m
    volume:
      storageClaim: 10Gi
      storageCapacity: 10Gi        
  zk:
    container:
      replica_count: 3
      resource:
        limit_memory: 500Mi
        limit_cpu: 1000m
        requests_memory: 500Mi
        requests_cpu: 1000m
    volume:
      storageClaim: 10Gi
      storageCapacity: 10Gi

更新后

infra:
  etcd:
    container:
      **image:
        tag: etcd-21.3.4**
      replica_count: 3
      resource:
        limit_memory: 1000Mi
        limit_cpu: 1000m
        requests_memory: 1000Mi
        requests_cpu: 1000m
    volume:
      storageClaim: 5Gi
      storageCapacity: 5Gi
  kafka:
    container:
      **image:
        tag: kafka-21.3.4**
      replica_count: 3
      resource:
        limit_memory: 2000Mi
        limit_cpu: 1000m
        requests_memory: 2000Mi
        requests_cpu: 1000m
    volume:
      storageClaim: 10Gi
      storageCapacity: 10Gi        
  zk:
    container:
      **image:
        tag: zk-21.3.4**
      replica_count: 3
      resource:
        limit_memory: 500Mi
        limit_cpu: 1000m
        requests_memory: 500Mi
        requests_cpu: 1000m
    volume:
      storageClaim: 10Gi
      storageCapacity: 10Gi

我是 python 和 yaml 处理的新手,任何参考都会有所帮助。 我可以打开和关闭文件,但无法获得添加/删除/更新新标签和值的具体指南。甚至 contents.update 也在第一次图像标签更新后删除数据。

import yaml

# Read the YAML file
with open ('in.yaml', 'r') as read_file:
    contents = yaml.safe_load(read_file)
   
contents['infra']['etcd'] = 'Image' 

# Write the YAML file with sort_keys=False to retain same order
with open('in.yaml', 'w') as write_file:
    yaml.dump(contents, write_file, sort_keys=False)

【问题讨论】:

  • 我认为 ** 突出显示了添加。标量开头的 * 在 YAML 中具有特殊含义(表示先前由锚点 (&) 定义的数据的别名)。

标签: python python-3.x yaml


【解决方案1】:

您的 YAML 加载到 Python 数据结构中,其中键 'etcd' 的值是一个字典。如果 您通过执行以下操作来替换该词典:

contents['infra']['etcd'] = 'Image'

你用一个字符串替换值(即字典),你不会得到你显示的输出。

要获取 ** 之间的部分,您需要更新 container with a dict 的值:

import sys
from pathlib import Path
import ruamel.yaml

file_in = Path('input.yaml')

    
yaml = ruamel.yaml.YAML()
data = yaml.load(file_in)
for key in ['etcd', 'kafka', 'zk']:
    data['infra'][key]['container'].insert(0, 'image', dict(tag=f'{key}-21.3.4'))
yaml.dump(data, sys.stdout)

这使:

infra:
  etcd:
    container:
      image:
        tag: etcd-21.3.4
      replica_count: 3
      resource:
        limit_memory: 1000Mi
        limit_cpu: 1000m
        requests_memory: 1000Mi
        requests_cpu: 1000m
    volume:
      storageClaim: 5Gi
      storageCapacity: 5Gi
  kafka:
    container:
      image:
        tag: kafka-21.3.4
      replica_count: 3
      resource:
        limit_memory: 2000Mi
        limit_cpu: 1000m
        requests_memory: 2000Mi
        requests_cpu: 1000m
    volume:
      storageClaim: 10Gi
      storageCapacity: 10Gi
  zk:
    container:
      image:
        tag: zk-21.3.4
      replica_count: 3
      resource:
        limit_memory: 500Mi
        limit_cpu: 1000m
        requests_memory: 500Mi
        requests_cpu: 1000m
    volume:
      storageClaim: 10Gi
      storageCapacity: 10Gi

我正在使用我的 ruamel.yaml 包,它是对 PyYAML 的改进,支持更新的 YAML 1.2 标准(2009 年发布)。 它还允许您在映射/字典中插入(即在特定位置更新键列表) 您从 YAML 加载的(在第一个位置获取密钥 image),并且还将保留 您的文件中可能包含的任何 cmets、别名、密钥排序等。 (如果需要,您还可以在标量周围保留多余的引号,但您的输入中没有任何引号)

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    相关资源
    最近更新 更多