Использование якорей YAML в разных файлах с использованием python / ruamel.yamlPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Использование якорей YAML в разных файлах с использованием python / ruamel.yaml

Сообщение Anonymous »

Я создал 2 файла yaml, которые выглядят следующим образом: < /p>
file1.yaml:
variables:
host1: &host1 'https://example.com'
< /code>
file2.yaml:
app:
host: *host1
< /code>
As you can see I want to use the YAML anchor &host1 в другом файле YAML. Теперь я знаю, что YAML не поддерживает это, но это возможно использовать сценарий Python и ruamel.yaml .
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'


Подробнее здесь: https://stackoverflow.com/questions/794 ... uamel-yaml
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»