首页 > 解决方案 > 如何在 python 中使用 ruamel 库为数组添加新元素?

问题描述

我有一个要使用 ruamel 更改的 yaml 文件。如果部署只包含一个环境,我可以更改它。问题是我想添加/更改多个环境。这是一个示例代码,它适用于使用 2 个参数的一个环境。

示例.py

import ruamel.yaml
import sys

file_name = 'Jenkinsfile.yaml'
from ruamel.yaml.util import load_yaml_guess_indent

config, ind, bsi = load_yaml_guess_indent(open(file_name))

totalArgs = len(sys.argv) - 1
print(totalArgs)
print(sys.argv[1:])

if totalArgs == 2:
    deploy = config['deploy']
    deploy[0]['env'] = sys.argv[1]
    deploy[0]['org'] = sys.argv[2]

elif totalArgs == 4:
    deploy = config['deploy']

    deploy[0]['env'] = sys.argv[1]
    deploy[0]['org'] = sys.argv[2]

    deploy[0]['env'] = sys.argv[3]
    deploy[0]['org'] = sys.argv[4]
    deploy[0]['host'] = 'https://**.com'
    deploy[0]['loc'] = 'saas'
    deploy[0]['manifest'] = 'manifest_dev.yml'
ruamel.yaml.round_trip_dump(config, open('Jenkinsfile.yaml', 'w'), 
                            indent=ind, block_seq_indent=bsi)

结果

sample.py 仿真测试

deploy:
- env: mitul-trial (Will change)
  org: test (Will change)
  host: https://**.com (will remain same)
  loc: saas (will remain same)
  manifest: manifest_dev.yml (will remain same)
  approval: true (will remain same)

想要的结果:

sample.py mitul-trial 测试 mitul1 testsomething

deploy:
- env: mitul-trial (Will change)
  org: test (Will change)
  host: https://**.com (will remain same)
  loc: saas (will remain same)
  manifest: manifest_dev.yml (will remain same)
  approval: true (will remain same)

- env: mitul1 (Will change)
  org: testsomething (Will change)
  host: https://**.com (will remain same)
  loc: saas (will remain same)
  manifest: manifest_dev.yml (will remain same)
  approval: true (will remain same)

标签: python-3.xyamlruamel.yaml

解决方案


您的代码不起作用,因为您没有将新元素添加到作为 key 值的序列/列表中deploy。您只是为第一个条目分配新值。

有几种方法可以复制这样的值,但由于它是一个 dict,因此您需要确保您没有复制引用(这也会导致更新第一个元素)。在这种情况下copy.deepcopy(),为了安全起见,最好从标准库中使用。为此包括

from copy import deepcopy

因此,您elif的代码应阅读:

elif totalArgs == 4:
    elem = deepcopy(config['deploy'][0])
    config['deploy'].append(elem)

    elem['env'] = sys.argv[1]
    elem['org'] = sys.argv[2]

    elem['env'] = sys.argv[3]
    elem['org'] = sys.argv[4]
    elem['host'] = 'https://**.com'
    elem['loc'] = 'saas'
    elem['manifest'] = 'manifest_dev.yml'

得到你想要的输出。


推荐阅读