見出し画像

設定ファイルを読み込むクラス(Python)

 プログラムの実行に必要な条件は、ソースコードの中に書いてもよいのですが、頻繁に書き換えたり、使い分けたりする場合は、別のファイルにしておくほうが管理しやすいと思います。Pythonでも同様なので、設定ファイルを読み込むクラスを作りました。なお、Pythonの勉強も兼ねて作成しましたので、良いコードではないかもしれません。ご容赦ください。

使い方
 config.pyをインポートして、Config("設定ファイル名") としてインスタンスを作ってください。プロパティーに設定ファイルに書いた内容がセットされます。
 クラスConfig内に自由にプロパティー(変数)を作ってください。変数、List、dictにも値を入れることができます。関数setvalue()の if文で各プロパティーに値を入れるように書き換えてください。wdが名前、valが値です。詳細はソースコードと設定ファイル例を見てください

import config.py

cfg = Config("xyz.ini")

ソースコード

import pprint


class Config():
    #プロパティー 
    folderlist:list=[]
    userdict:dict  ={}
    arekore:str
    size:int
    rate:float


    
    def setvalue(self, wd :str, val :str) ->None:
        #引用符が使われているときは 、取る
        if wd == "folderlist": #listに入れる 
            v:str = self.remQM(val)
            self.folderlist.append(v)
        elif wd == "userdict":    #辞書に入れる 
            u:list = val.split(",")
            ky :str = self.remQM(u[0])
            it :str = self.remQM(u[1])
            self.userdict[ky] = it
        elif wd == "arekore":
            v :str = self.remQM(val)
            self.arekore = v

        elif wd == "size":
            self.size = int(val)

        elif wd == "rate":
            self.rate = float(val)
        

        return
    
    #ファイルのデータから変数に値をセットする 
    def configmain(self, d:str):
        #行に分割 
        data :list = d.split("\n")

        #各行ごとに 
        for ln  in data:

            #前後の空白を取る 
            line:str = ln.strip()
            #空行は飛ばす 
            if len(line) == 0:
                continue
            #コメント行は飛ばす 
            if line[0] in "#!$%&@":
                continue
            #イコールで分割し 、キーワードと値に分ける    
            wdval:list = line.split("=") # "="で分割

             #=で分割できないデータは飛ばす
            if len(wdval) < 2:
                continue

            wd:str = wdval[0].strip() #keyword 。小文字に変換
            val:str = wdval[1].strip() #value 

            self.setvalue(wd, val)
                     
        return 
    
    


    def remQM(self, s :str) -> str:
        #先頭に引用符が使われているときは 、両端から1文字ずつ取る
        s = s.strip()
        if s[0] in "\'\"":
            s = s[1:-1]
        return s
    
    def __init__(self,fname) -> None:
        d:str = self.readfile(fname)
        self.configmain(d)
        return

    def readfile(self, fname:str) -> str:
        f = open(fname, "r")
        d:str = f.read()
        f.close()
        return d
    


    




def main():
    cfg = Config("xyz.ini")

    print("variables:")
    pprint.pprint(cfg.__dict__)

    print("folderlist =")
    pprint.pprint(cfg.folderlist)
    print("userdict =")
    pprint.pprint(cfg.userdict)

    
    return

# main
if __name__ == "__main__":
    main()

設定ファイルの例

### フォルダ。リストに入れるもの。
folderlist  = "c:\users\Pictures\abc"
folderlist  = "c:\users\Pictures\def"
folderlist  = "c:\users\Pictures\ghi\jkl"
folderlist  = "c:\users\Videos\pqrst


###名前と所属。辞書に入れるもの。
userdict = "Yayoi", "人事部"
userdict = "Akiko", "技術部"
userdict = "美佐江", "営業部3課"
userdict = "みゆき", "解雇済み"
userdict = "加奈子", "経理部2課"


###変数に入れるもの #ファイル名 
arekore = "data.xlsm, codename.doc" #サイズ 
size = 65536 #浮動点少数 
rate = 3.1415926

実行例
config.pyだけを実行すると、ファイルから取得した内容を表示します(この部分の関数main()も書き換えが必要)。以下に結果を示します。設定ファイルと比較してみてください。

variables:
{'arekore': 'data.xlsm, codename.doc', 'rate': 3.1415926, 'size': 65536}
folderlist =
['c:\\users\\Pictures\\abc',
 'c:\\users\\Pictures\\def',
 'c:\\users\\Pictures\\ghi\\jkl',
 'c:\\users\\Videos\\pqrs']
userdict =
{'Akiko': '技術部', 'Yayoi': '人事部', 'みゆき': '解雇済み', '加奈子': '経理部2課', '美佐江': '営業部
3課'}

以上

#Python , #設定ファイル

応援してやろうということで、お気持ちをいただければ嬉しいです。もっと勉強したり、調べたりする糧にしたいと思います。