Cucco’s Compute Hack

コンピュータ関係の記事を書いていきます。

pythonでyamlファイルの読み込み(コンフィグファイルとして)

yamlに書いた内容が、文字列や数値がその型で取得できる。

辞書型と、リストにはいった辞書のyamlの書き方を追記。

ソースコード

import yaml
import os
import pprint

# yamlファイルは、このhello_yaml.pyと同じディレクトリにある想定
default_yaml_filename = "config.yaml"


class config():
    def __init__(self):
        self.foo = None
        self.bar = None
        self.hoge = None
        self.piyo = None
        
        self.dics = None
        self.dics_list=None
        self.default_yaml_fullpath = os.path.dirname(
            os.path.abspath(__file__)) + os.sep + default_yaml_filename

        self.load()

    def load(self):
        try:
            # 念のため絶対パスでアクセス
            with open(self.default_yaml_fullpath,"r",encoding="utf-8") as f:
                y = yaml.load(stream=f, Loader=yaml.SafeLoader)
                self.foo = y.get("foo")
                self.bar = y.get("bar")
                self.hoge = y.get("hoge")
                self.piyo = y.get("piyo")
                self.dics = y.get("dics")
                self.dics_list = y.get("dics_list")
                
        except:
            print("error", self.default_yaml_fullpath)
            raise


config = config()

print("config.foo: {0} {1}".format(config.foo, type(config.foo)))
print("config.bar: {0} {1}".format(config.bar, type(config.bar)))
print("config.hoge: {0} {1}".format(config.hoge, type(config.hoge)))
print("config.piyo: {0} {1}".format(config.piyo, type(config.piyo)))
print("config.dics: {0} {1}".format(config.dics, type(config.dics)))
pprint.pprint(config.dics)
print("config.dics_list: {0} {1}".format(config.dics_list, type(config.dics_list)))
pprint.pprint(config.dics_list)

config.yamlファイル(ソースコードと同じディレクトリ)

foo: foo1
bar: 100
hoge: 3.14
piyo: 
  - piyo1
  - piyo2
  - 100
  - 3.14
dics:
  x: 100
  y: 200
dics_list:
  - a: 1111
    b: 2222
  - c: 3333
    d: 4444

実行結果

> >python hello_yaml.py
config.foo: foo1 <class 'str'>
config.bar: 100 <class 'int'>
config.hoge: 3.14 <class 'float'>
config.piyo: ['piyo1', 'piyo2', 100, 3.14] <class 'list'>
config.dics: {'x': 100, 'y': 200} <class 'dict'>
{'x': 100, 'y': 200}
config.dics_list: [{'a': 1111, 'b': 2222}, {'c': 3333, 'd': 4444}] <class 'list'>
[{'a': 1111, 'b': 2222}, {'c': 3333, 'd': 4444}]

補足
Loader指定のないyaml.load(f)は推奨されない。y = yaml.load(stream=f, Loader=yaml.SafeLoader)に変更。

C:\dev\SampleCodes\hello_yaml\hello_yaml.py:20: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
  y = yaml.load(f)