如何在 python 中使用 ruamel 库为数组添加新元素?
How to add a new element for array using ruamel library in python?
我有一个 yaml 文件,我想使用 ruamel 更改它。如果部署只包含一个环境,我可以更改它。问题是我要add/change多个环境。
这是一个示例代码,适用于使用 2 个参数的一个环境。
sample.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 test 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)
您的代码无效,因为您没有向 sequence/list 添加新元素,即键 deploy
的值。您只是在为第一个条目分配新值。
有多种方法可以复制这样的值,但由于它是一个字典,您需要确保您没有复制引用(这也会导致更新第一个元素)。在这种情况下,为了安全起见,您最好使用标准库中的 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'
得到你想要的输出。
我有一个 yaml 文件,我想使用 ruamel 更改它。如果部署只包含一个环境,我可以更改它。问题是我要add/change多个环境。 这是一个示例代码,适用于使用 2 个参数的一个环境。
sample.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 test 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)
您的代码无效,因为您没有向 sequence/list 添加新元素,即键 deploy
的值。您只是在为第一个条目分配新值。
有多种方法可以复制这样的值,但由于它是一个字典,您需要确保您没有复制引用(这也会导致更新第一个元素)。在这种情况下,为了安全起见,您最好使用标准库中的 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'
得到你想要的输出。