[英]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.