通过 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

列表 commandsAcommandsB 中的元素是字典,如果您复制这些元素,您将在结构中获得对相同项目的多次引用,从而导致锚点 (&) 和别名 (*)

获取所需 YAML 的最快方法可能是使用 deepcopy:

from copy import deepcopy

jobMap[0]['sequence']['commands'] = deepcopy(commandsA) + deepcopy(commandsB)