通过 PyYAML 编辑现有的 YAML 和复制条目
Editing existent YAML and duplicating entries through PyYAML
我有一个具有以下结构的 YAML:
- description: 'DUMMY_JOB'
sequence:
commands:
- description: Metadata
script: ASDF
- description: Login
jobref:
args: ASDF
group: ''
name: ASDF
nodeStep: 'true'
- description: Deployment
jobref:
args: ASDF
group: ''
name: ASDF
nodeStep: 'true'
- description: Logout
jobref:
group: ''
name: ASDF
nodeStep: 'true'
keepgoing: false
strategy: node-first
uuid: 'UNIQUE_ID'
这个 YAML 用作 Rundeck 内部的工作描述,我要做的基本上是复制命令编辑数据(旧命令)和新命令以反映新参数。
我正在通过 PyYaml 加载它:
jobStream = open("example.yaml", 'r')
jobMap = yaml.safe_load(jobStream)
并通过以下方式访问它:
jobMap[0]['sequence']['commands']
带回我需要的数据。但是,如果我只是通过合并复制它,例如:
commandsA = jobMap[0]['sequence']['commands']
commandsB = jobMap[0]['sequence']['commands']
jobMap[0]['sequence']['commands'] = commandsA + commandsB
如果我尝试 yaml.dump(jobMap)
它不会重复命令,但会显示 ID:
- *id001
- *id002
- *id003
- *id004
列表 commandsA
和 commandsB
中的元素是字典,如果您复制这些元素,您将在结构中获得对相同项目的多次引用,从而导致锚点 (&
) 和别名 (*
)
获取所需 YAML 的最快方法可能是使用 deepcopy
:
from copy import deepcopy
jobMap[0]['sequence']['commands'] = deepcopy(commandsA) + deepcopy(commandsB)
我有一个具有以下结构的 YAML:
- description: 'DUMMY_JOB'
sequence:
commands:
- description: Metadata
script: ASDF
- description: Login
jobref:
args: ASDF
group: ''
name: ASDF
nodeStep: 'true'
- description: Deployment
jobref:
args: ASDF
group: ''
name: ASDF
nodeStep: 'true'
- description: Logout
jobref:
group: ''
name: ASDF
nodeStep: 'true'
keepgoing: false
strategy: node-first
uuid: 'UNIQUE_ID'
这个 YAML 用作 Rundeck 内部的工作描述,我要做的基本上是复制命令编辑数据(旧命令)和新命令以反映新参数。
我正在通过 PyYaml 加载它:
jobStream = open("example.yaml", 'r')
jobMap = yaml.safe_load(jobStream)
并通过以下方式访问它:
jobMap[0]['sequence']['commands']
带回我需要的数据。但是,如果我只是通过合并复制它,例如:
commandsA = jobMap[0]['sequence']['commands']
commandsB = jobMap[0]['sequence']['commands']
jobMap[0]['sequence']['commands'] = commandsA + commandsB
如果我尝试 yaml.dump(jobMap)
它不会重复命令,但会显示 ID:
- *id001
- *id002
- *id003
- *id004
列表 commandsA
和 commandsB
中的元素是字典,如果您复制这些元素,您将在结构中获得对相同项目的多次引用,从而导致锚点 (&
) 和别名 (*
)
获取所需 YAML 的最快方法可能是使用 deepcopy
:
from copy import deepcopy
jobMap[0]['sequence']['commands'] = deepcopy(commandsA) + deepcopy(commandsB)