iniファイルを使う時はだいたい同じ設定なので気軽に使えるように調整したラッパー。
辞書型を扱う感じで使えます。
main.py
#! env python
# -*- coding: utf-8 -*-
import os
import sys
import time
import configparser
class Config(object):
def __init__(self, path="config.ini", section="root", value={}, encode="utf-8"):
"""
:param path: ファイルパス
:type path: str
:param section: 対象セクション名
:type section: str
:param value: 値一覧
:type value: dict
"""
self.__path = path
self.__section = section
self.__data = value
self.__encode = encode
self.read()
pass
def set_encode(self, encode):
self.__encode = encode
def set_section(self, value):
"""
:param value: セクション名
:type value: str
"""
self.__section = value
def get_section(self):
"""
:return: セクション名
:rtype: str
"""
return self.__section
def __setitem__(self, key, value):
"""
a[key] = value
:param key: キー
:type key: str
:param value:
:return:
"""
self.__data[key] = value
def __getitem__(self, key):
"""
b = a[key]
:param key: キー
:type key: str
:return: 値
"""
return self.__data[key]
def __delitem__(self, key):
"""
del a[key]
:param key: キー
:type key: str
"""
del self.__data[key]
def get_int(self, key):
"""
:param key: キー
:return: 値
:rtype: int
"""
return int(self.__data[key])
def get_bool(self, key):
"""
:param key: キー
:return: 値
:rtype: bool
"""
if self.__data[key] == "yes" or self.__data[key] == "on" or self.__data[key] == "1" or \
self.__data[key] == 1 or self.__data[key]:
return True
elif self.__data[key] == "no" or self.__data[key] == "off" or self.__data[key] == "0" or \
self.__data[key] == 0 or not self.__data[key]:
return False
return None
def get_float(self, key):
"""
:param key: キー
:return: 値
:type: float
"""
return float(self.__data[key])
def get_str(self, key):
"""
:param key: キー
:return: 値
:rtype: str
"""
return str(self.__data[key])
def get(self):
"""
:return: 値
:rtype: dict
"""
return self.__data
def set(self, value={}):
"""
:param value: 値
:type value: dict
"""
if isinstance(value, dict):
self.__data = value
def add(self, value={}):
"""
:param value: 値
:type value: dict
"""
if isinstance(value, dict):
self.__data.update(value)
def read(self):
"""
ファイル読み込み
"""
if not os.path.exists(self.__path):
self.write()
return
parser = configparser.ConfigParser()
parser.read(self.__path, self.__encode)
# 読み込んだファイルに対象セクションがあれば値を読み込む
if self.__section in parser.sections():
self.__data = {key: parser[self.__section][key] for key in parser[self.__section]}
def write(self):
"""
ファイル書き出し
"""
if len(self.__data) != 0 and self.__path != "":
# ステータスファイルを書き出す場合
parser = configparser.ConfigParser()
if os.path.exists(self.__path):
# ファイルが存在する場合、対象セクション以外も取り込むために読み込む
parser.read(self.__path, self.__encode)
# データ上書き
parser[self.__section] = self.__data
with open(self.__path, 'w', encoding=self.__encode) as config_file:
parser.write(config_file)
# 書き込みタイミング調整用
time.sleep(0.1)
使用例
main.py
if __name__ == '__main__':
# インスタンス作成時にファイルが存在しなければファイル作成する。
config = Config(path="test.ini",
section="root",
value={
"test": "test",
"int": 1,
"bool": 0
})
# 読み込み
print(config["test"])
# intで読み込み
print(config.get_int("int"))
# boolで読み込み
print(config.get_bool("bool"))
# 一部の値を変更
config["test"] = "test2"
# 保存
config.write()
# 現在の値一覧表示
print(config.get())
# 一部削除
del config["test"]
print(config.get())
# 同じファイルの別セクション作成
config2 = Config(path="test.ini", section="test", value={"key1": "value1"})
config2.write()
# 同じファイルの別セクションを作り、値を変更して保存
config3 = Config(path="test.ini", section="test2", value={"key2": "value2"})
config3.set({"key3": "value3"})
config3.write()