1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

iniファイルを使いやすくするラッパー(Python)

Last updated at Posted at 2019-03-15

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()
1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?