見出し画像

Pythonでの設定ファイルからの値の取得

 多少のカスタマイズの可能性を求めるものになると、プログラムのソースコードとはテキストファイルなど別途、設定値を置きたく成って来るものだ。
 その際、過去、何度も似たものを作り、忘れて来ているので、この際、セキュリティ上の課題は抱えるものの、Pythonの書式で書いたオブジェクトも含め「eval()関数」で取得するものを作ったので、ここに残しておくことにする。
 取り敢えず、文字列と整数以外はeval()関数に依存させたことで、悪用すれば、設定ファイルに処理を入れ込むことも可能には成るので、活用に当たっては、設定ファイルへのアクセス制限とシステムが必要する設定値の枠内かどうかの判定程度はする必要はある。

ソースコード

def get_val_from_ini(item, file='./default.ini'):
    '''
    文字列ファイルに記されたitemに対する値を返す関数
    '''
    from os.path import exists
    
    if exists(file):                                            #ファイルが在ったら処理へ
        with open(file, encoding='utf-8') as _f_ini:            #  ファイルを開いて
            _lines = _f_ini.readlines()                         #    文字列のリストに納める
            for _line in _lines:                                #    リストから一行文字列を取得
                #print(_line)
                if '#' in _line:                                #      「#」が在ればその前迄が式なので
                    _line = _line = _line[:_line.find(('#'))]   #        尻を切る
                    
                if (item in _line                               #      項目名が含まれ
                and    '=' in _line                             #      「=」が含まれ
                and not _line.strip()[0]=='#'):                 #      行頭に「#」が無いなら
                    
                    
                    _val = _line[_line.find('=')+1:]            #        両端の空白文字を剥ぎ取る
                                                                #        ※これで値文字列_sの抽出完了
                                                                
                                                                #        これより、先ずは文字列値なら文字列を返し、
                                                                #        数値表記なら数値として、それ以外なら
                                                                #        eval()関数に依存した値を返すことにする
                                                                
                    _s = _val[:]                                #        文字列のコピー       
                    if (_s[0] in ['\'', '"']
                    and _s[-1] in ['\'', '"']
                    and _s[0]==_s[-1]):                         #       両端に同じ引用符が在れば文字列なので
                        _s = _s[1:]                             #         両端の引用符を剥取り
                        _s = _s[:-1]
                        _val = _s                               #         値として
                        return _val                             #         返えす
                    
                    elif _s.isdecimal():                        #       数時文字列なら
                        _val = int(_s)                          #         整数として
                        return _val                             #
                    
                    elif _s.isnumeric():                        #       数字系の文字列なら
                        _val = eval(_s)                         #         取り敢えず、eval()関数任せで
                        return _val                             #
                    
                    else:                                       #       それ以外の全ては、eval()関数に丸投げ
                        _val = eval(_s)                         #       ※何も判断無く外部ファイルの文字列を取込むことは
                        return _val                             #       セキュリティの観点から望ましくは在りません。
                        #print(_index_title)
                    #else:
                    #    _index_title = ''
    return ''                                                   #ファイルが無く処理から漏れたら、空文字を返す

if __name__ == "__main__":
    title_name = get_val_from_ini(item=' title_name ',file='./test.ini')
    xyz = get_val_from_ini(item=' xyz ',file='./test.ini')

test.ini

  title_name = 'Oh My God!'
  xyz = [1, 2, 3]

実行結果

Oh My God!
[1, 2, 3]

この記事が気に入ったらサポートをしてみませんか?