簡體   English   中英

在 for 循環中解析 yaml 文件並創建新的 yaml 文件 - 非特定標簽 - Python

[英]Parse a yaml file in a for loop and create new yaml files - non-specific tag - Python

大家好,我想加載一個 yaml 文件,解析它並為每個非特定標簽(!元素)創建新的 yaml 文件

我想在一個新的 yaml 文件 vor 示例中刪除每個 !Element 的部分

new_folder/element1/element1_config.yml

內容應該是:

    name: element1
    gnc_script:
      - '*fcc_cores_1'
      - '*setup'
    relationship:
      - projectx
      - projectxy
      - projectxyt
      # indirect related on
      - projectxyz1

我的 yaml 看起來像這樣(我原來的 yml 非常大,並且有 100 多個 !Elements 所以對於這個問題,我使用了一個較短的版本):

elements:
  - !Element
    name: element1
    gnc_script:
      - '*fcc_cores_1'
      - '*setup'
    relationship:
      - projectx
      - projectxy
      - projectxyt
      # indirect related on
      - projectxyz1

  - !Element
    name: element2
    gnc_script:
      - '*fcc_cores_1'
    relationship:
      - projectx
      - projectxy
      - projectxyt
      # indirect related on
      - projectxyz1

  - !Element
    name: element3
    gnc_script:
      - '*fcc_cores_1'
      - '*setup'
    relationship:
      - projectx
      - projectxy
      - projectxyt
      # indirect related on
      - projectxyz1

你知道我該如何解決嗎?

到目前為止我所擁有的:

import yaml


with open ('elements.yml', 'r') as elements_file:
    elements_yml = yaml.load(elements_file)

elements= elements_yml["elements"]["!Element"]

for element in elements:
   os.makedirs(elements_yml["elements"]["!Element"]["name"])

   # create new yaml file with content of element

如果你想處理一個 YAML 文件的結構而不關心內容,你不需要構造原生的 Python 對象。 相反,使用節點圖:

import yaml, sys
from yaml.nodes import SequenceNode, MappingNode
from yaml.resolver import BaseResolver

input = """
elements:
  - !Element
    name: element1
    gnc_script:
      - '*fcc_cores_1'
      - '*setup'
    relationship:
      - projectx
      - projectxy
      - projectxyt
      # indirect related on
      - projectxyz1

  - !Element
    name: element2
    gnc_script:
      - '*fcc_cores_1'
    relationship:
      - projectx
      - projectxy
      - projectxyt
      # indirect related on
      - projectxyz1

  - !Element
    name: element3
    gnc_script:
      - '*fcc_cores_1'
      - '*setup'
    relationship:
      - projectx
      - projectxy
      - projectxyt
      # indirect related on
      - projectxyz1
"""

node = yaml.compose(input)

visited = set()

def output(node):
  yaml.serialize(node, sys.stdout)
  sys.stdout.write("...\n")

def visit(node):
  if node in visited: return
  if node.tag == "!Element":
    node.tag = BaseResolver.DEFAULT_MAPPING_TAG
    output(node)
  visited.add(node)
  if isinstance(node, SequenceNode):
    for child in node.value:
      visit(child)
  elif isinstance(node, MappingNode):
    for k,v in node.value:
      visit(k); visit(v)

visit(node)

這輸出:

name: element1
gnc_script:
- '*fcc_cores_1'
- '*setup'
relationship:
- projectx
- projectxy
- projectxyt
- projectxyz1
...
name: element2
gnc_script:
- '*fcc_cores_1'
relationship:
- projectx
- projectxy
- projectxyt
- projectxyz1
...
name: element3
gnc_script:
- '*fcc_cores_1'
- '*setup'
relationship:
- projectx
- projectxy
- projectxyt
- projectxyz1
...

出於演示目的,此代碼包括其對標准輸出的輸入和輸出; 只需重寫output(node)以創建您想要的文件並用您想要處理的文件替換輸入。 例如,這會將它們寫入單獨的文件中; 需要元素中鍵name的現有標量值:

def output(node):
  name = next(x[1].value for x in node.value if x[0].value == "name")
  with open("{0}.yaml".format(name), "w") as f:
    yaml.serialize(node, f)

如您所見,輸入中的注釋不是輸出的一部分。 這是因為它們被 PyYAML 的解析器丟棄了。 使用 PyYAML 沒有簡單的方法來解決這個問題; 您可以嘗試嘗試保留評論的ruamel ,但我不知道它的 API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM