PythonでYAMLファイルの変数を置換する方法について説明します。この記事は、Stack Overflowの質問「How to replace environment variable value in yaml file to be parsed using python script」と「Replace fields in yaml file by python」を参考にしています。

環境変数の置換

PythonのYAMLライブラリはデフォルトでは環境変数を解決しません。環境変数を定義する正規表現を見つけ、それを解決する関数を実行する暗黙のリゾルバーを定義する必要があります。これはyaml.add_implicit_resolveryaml.add_constructorを通じて行うことができます。

以下に示すコードでは、YAMLの値で${環境変数}に一致するリゾルバーを定義し、環境変数を検索するためのpath_constructor関数を呼び出しています。

import yaml
import re
import os

path_matcher = re.compile(r'\\$\\{([^}^{]+)\\}')

def path_constructor(loader, node):
    value = node.value
    match = path_matcher.match(value)
    env_var = match.group()[2:-1]
    return os.environ.get(env_var) + value[match.end():]

yaml.add_implicit_resolver('!path', path_matcher)
yaml.add_constructor('!path', path_constructor)

data = \"\"\" 
env: ${VAR}/file.txt
other: file.txt
\"\"\"

if __name__ == '__main__':
    p = yaml.load(data, Loader=yaml.FullLoader)

フィールドの置換

YAMLファイルのフィールドを置換するには、yaml.safe_loadを使用してYAMLファイルをPythonの辞書にロードし、その後で辞書のキーと値を操作します。

def change_yaml(path_to_yaml):
    try:
        with open(path_to_yaml) as yaml_file:
            doc = yaml.safe_load(yaml_file)
            doc['dir_base'] = 'other_dir_base'
            doc['analyses']['configs_to_test_dir'] = 'other_configs_temp'
    except EnvironmentError as e:
        raise ValueError('Could not open yaml file {}:\\n{}'.format(path_to_yaml, e))

    try:
        with open(path_to_yaml, 'w') as yaml_file:
            yaml.dump(doc, yaml_file)
    except EnvironmentError as e:
        raise ValueError('Could not write to yaml file {}:\\n{}'.format(path_to_yaml , e))

以上、PythonでYAMLファイルの変数を置換する方法について説明しました。この情報が役立つことを願っています。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です