python之configparser配置文件解析器

2023-09-05 14:22:59 浏览数 (1)

一个不是很重要的介绍

configparser 模块是 Python 标准库中用于处理配置文件的模块,它可以读取、写入和修改配置文件。配置文件通常用于存储程序的配置选项、参数或者其他需要持久化的配置信息。下面简单写一下 configparser 模块的使用示例

写入配置使用方法

example.py 示例文件

代码语言:javascript复制
# -*- coding: utf-8 -*-
# @Author: Mehaei
# @Date: 2023-08-31 19:54:06
# @Last Modified by: Mehaei
# @Last Modified time: 2023-09-01 09:48:53

import configparser

config = configparser.ConfigParser()
# 写配置文件
config["redis"] = {
    "host": "127.0.0.1",
    "port": "6379"
}

config["exec"] = {}
config["exec"]["debug"] = "False"
config["exec"]["node"] = "10"

with open("config.ini", "w ") as f:
    config.write(f)

config.ini 配置文件内容为

代码语言:javascript复制
[redis]
host = 127.0.0.1
port = 6379

[exec]
debug = False
node = 10

读取配置文件示例

example.py 示例文件

常用属性和方法已经写在了示例中

代码语言:javascript复制
# -*- coding: utf-8 -*-
# @Author: Mehaei
# @Date: 2023-08-31 19:54:06
# @Last Modified by: Mehaei
# @Last Modified time: 2023-09-01 21:00:55
import configparser
config = configparser.ConfigParser()
config.read("config.ini")

# 获取转换布尔值的映射表, 这个属性既然能读, 当然也可以按实际开发情况更新和修改

print("配置布尔值", configparser.ConfigParser.BOOLEAN_STATES)


# 获取配置的子节点
print("子节点", config.sections())

# 获取某一个配置
redis_port = config["redis"]["port"]
print("默认读取", redis_port, type(redis_port))


"""
读取的字段默认都是字符串类型
可以显式的转换一下类型
也可以直接使用以下方法获取转换后的字段值
getboolean: 获取布尔值
getfloat: 获取浮点数
getint: 获取整数
"""
redis_port = config["redis"].getint("port")
print("使用getint读取", redis_port, type(redis_port))

# 获取不存在的字段给默认值
undefined = config["redis"].get("name", "undefined")
print("未定义的字段", undefined, type(undefined))

示例代码输出

代码语言:javascript复制
配置布尔值 {'1': True, 'yes': True, 'true': True, 'on': True, '0': False, 'no': False, 'false': False, 'off': False}
子节点 ['redis', 'exec']
默认读取 6379 <class 'str'>
使用getint读取 6379 <class 'int'>
未定义的字段 undefined <class 'str'>

读取配置文件高阶用法

在配置文件中使用配置文件的变量

有时候我们需要在配置文件中时候使用配置文件的变量

由几个不同的变量组成一个新的变量, 可以使用以下方法

首先修改一下配置文件, 改为如下所示

代码语言:javascript复制
[redis]
host = 127.0.0.1
port = 6379
url = redis:%(host)s:%(port)s
url2 = redis:${host}:${port}
debug = redis-debug:${exec:debug}

[exec]
debug = False
node = 10

方式一

使用格式 %(字段名)s

代码语言:javascript复制
config = configparser.ConfigParser()
config.read("config.ini")
print("url:", config["redis"]["url"])
print("url2:", config["redis"]["url2"])

示例代码输出

代码语言:javascript复制
url: redis:127.0.0.1:6379
url2: redis:${host}:${port}

方式二

使用格式 ${字段名} ${节点名:字段名} 节点名默认为当前节点

代码语言:javascript复制
config = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation())
print(type(config))
config.read("config.ini")
print("url:", config["redis"]["url"])
print("url2:", config["redis"]["url2"])
print("debug:", config["redis"]["debug"])

示例代码输出

代码语言:javascript复制
url: redis:%(host)s:%(port)s
url2: redis:127.0.0.1:6379
debug: redis-debug:False

两种使用方式都可以, 使用第二种方式时, 注意interpolation要使用ExtendedInterpolation类, 默认是BasicInterpolation类

扩展知识

往往在项目使用中, 会多次导入并使用这个配置文件

下面我们试着将读取配置文件封装一下,

再写个单例模式, 随便回顾一遍前面文章的内容

就不必每次都读取并实例化一遍配置文件

example.py 实例文件

代码语言:javascript复制
# -*- coding: utf-8 -*-
# @Author: Mehaei
# @Date: 2023-08-31 19:54:06
# @Last Modified by: Mehaei
# @Last Modified time: 2023-09-01 21:16:40
import os
import configparser


class Config(object):
    """
    公共配置类
    """
    _instance = None
    def __init__(self, cfile="config.ini", **ckwargs):
        """
        :param cfile: 配置文件路径
        :param ckwargs: ConfigParser参数
        :return configparser.ConfigParser
        """
        self.config = configparser.ConfigParser(**ckwargs)
        if not os.path.exists(cfile):
            raise ValueError(f"文件: {cfile} 不存在")
        self.config.read(cfile)

    def __call__(self):
        """
        使用config对象
        """
        return self.config

    def __new__(cls, *args, **kwargs):
        """
        单例模式
        """
        if not cls._instance:
            cls._instance = object.__new__(cls)
        return cls._instance

使用方法

1. 单例模式测试输出

代码语言:javascript复制
c = Config()
print(id(c))
c = Config()
print(id(c))
"""
输出
4431914488
4431914488
"""

2. 使用第一种插值方式

代码语言:javascript复制
c = Config()()
print(c["redis"]["url"])
print(c["redis"]["url2"])

输出

代码语言:javascript复制
redis:127.0.0.1:6379
redis:${host}:${port}

3. 使用第二种插值方式

代码语言:javascript复制
c = Config(interpolation=configparser.ExtendedInterpolation())()
print(c["redis"]["url"])
print(c["redis"]["url2"])

输出

代码语言:javascript复制
redis:%(host)s:%(port)s
redis:127.0.0.1:6379

这篇文章就到这里了, 睡觉!~

0 人点赞