Verwenden Sie YAML -Anker über verschiedene Dateien über Python / ruamel.yaml über verschiedene DateienPython

Python-Programme
Anonymous
 Verwenden Sie YAML -Anker über verschiedene Dateien über Python / ruamel.yaml über verschiedene Dateien

Post by Anonymous »

Ich habe 2 YAML -Dateien erstellt, die wie Folgendes aussehen: < /p>

Code: Select all

file1.yaml
:

Code: Select all

variables:
host1: &host1 'https://example.com'
< /code>
file2.yaml
:

Code: Select all

app:
host: *host1
< /code>
As you can see I want to use the YAML anchor &host1
in einer anderen YAML -Datei. Jetzt weiß ich, dass Yaml dies nicht unterstützt, aber es ist möglich, ein Python -Skript und Ruamel.yaml .

Code: Select all

import ruamel.yaml

def load_and_merge_yaml(base_file, target_file):
yaml = ruamel.yaml.YAML()

# Load the base YAML file (contains anchors)
with open(base_file, 'r') as base_file_obj:
base_data = yaml.load(base_file_obj)

# Load the target YAML file (we want to reuse anchors here)
with open(target_file, 'r') as target_file_obj:
target_data = yaml.load(target_file_obj)

# Manually merge the base data into the target data
# We will handle this by iterating through the base data and adding/replacing it in the target.
# If a key exists in the base data, we will add it to the target if it's missing
def merge_dicts(base, target):
for key, value in base.items():
if isinstance(value, dict):
# If the value is a dictionary, we recursively merge
if key not in target:
target[key] = {}  # Create the key if it's missing
merge_dicts(value, target[key])  # Recursively merge nested dictionaries
else:
# If the value is not a dictionary, just assign it to the target
if key not in target:
target[key] = value  # Add if missing

# Perform the merge
merge_dicts(base_data, target_data)

# Save the merged result to a new file
with open('merged_output.yaml', 'w') as output_file:
yaml.dump(target_data, output_file)

return target_data

# Example usage
base_file = 'file1.yaml'  # The file containing the anchors
target_file = 'file2.yaml'  # The file where we want to apply anchors
merged_data = load_and_merge_yaml(base_file, target_file)

# Print the merged data for inspection
print(ruamel.yaml.dump(merged_data, default_flow_style=False))
< /code>
And people tell me this should work but unfortunately I keep getting this error:
ruamel.yaml.composer.ComposerError: found undefined alias 'host1'
in "file2.yaml", line 2, column 9
< /code>
Does anyone know what I'm doing wrong? Below is the output I would like.
app:
host: 'https://example.com'

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post