一个不是很重要的介绍
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
方式一
代码语言:javascript复制使用格式 %(字段名)s
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
这篇文章就到这里了, 睡觉!~