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_resolver
とyaml.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ファイルの変数を置換する方法について説明しました。この情報が役立つことを願っています。