配置文件是开发过程中经常用到的,一般习惯将常量以及数据库、第三方接口地址等等配置在一个专门的文件里,便于需要更新时不用修改代码只需修改配置文件即可,这样大大的减少因为误操作代码导致的风险出现。而配置文件中ini文件也是工作中经常用到的,Python中通常使用内置模块configparser来解析配置文件。
ini文件的常见特点
1. 中括号[]内包含的为section,每一个section下每个配置为key-value格式
2. section的名字是区分大小写的,而key的名字是不区分大小写的
3. 键值对可用=或者:进行分隔
4. 键值对中,头部和尾部的空白符会被去掉
5. 配置文件可以包含注释,注释以#或者;为前缀
6. 获取每个option的值都是字符串
使用
1. 读取
import configparser
from pathlib import Path
base_dir = Path(__file__).resolve().parent
file_path = Path(base_dir, 'config.ini')
# 读取config.ini文件: 本质是构建一个大字典
config_obj = configparser.ConfigParser()
config_obj.read(file_path, encoding="utf-8")
2. 逻辑判断
# 判断是否存在指定的节点section或option是否存在
assert "Oracle" in config_obj, "不存在时提示此信息"
flag = config_obj.has_section("oracle")
flag1 = config_obj.has_option("Oracle", "port")
print(flag, flag1)3. 增
# 增加节点section
if not config_obj.has_section("Mongo"):
config_obj.add_section("Mongo")
config_obj.write(fp=open(file_path, 'w'))
# 增加节点section及下面的配置options
if not config_obj.has_option("MongoDb", "port"):
config_obj.add_section("MongoDb")
config_obj.set("MongoDb", "port", "27017")
config_obj.set("MongoDb", "host", "127.0.0.3")
config_obj.write(fp=open(file_path, 'w'))4. 删
# 删除指定的section
config_obj.remove_section("Mongo")
print(config_obj.sections())
config_obj.write(fp=open(file_path, 'w'))
# 删除指定section下的配置
config_obj.remove_option("MongoDb", "host")
config_obj.write(fp=open(file_path, 'w'))5. 改
# 修改指定section下某个配置的值
config_obj.set(section="Oracle", option="user", value="china")
config_obj.write(fp=open(file_path, "w"))6. 查
# 获取所有节点section
sections = config_obj.sections()
print(sections)
"""
['mysql', 'Oracle']
"""
# 获取指定section下配置的所有键key
print(config_obj.options("mysql"))
"""
['host', 'port', 'user', 'password']
"""
# 获取指定section下指定key的值
print(config_obj.get(section="mysql", option="host"))
print(config_obj["mysql"]["host"])
"""
127.0.0.1
"""
# 获取指定section下所有的配置信息
print(config_obj.items("mysql"))
"""
[('host', '127.0.0.1'), ('port', '3306'), ('user', 'admin'), ('password', 'admin2024')]
"""7. 拓展
同时只能识别一种占位符格式,不能ini文件中配置多种不同的占位符格式
# 因为从ini配置中读取的配置值都为字符串,但有些配置例如端口是int类型的,所以需要通过指定方法读取
port = config_obj.getint("mysql", "port")
port = config_obj.getfloat("mysql", "port")
port = config_obj.getboolean("mysql", "open_thread")
print(port, type(port))
# 对占位符的识别,需要初始化,指定interpolation为BasicInterpolation(),则配置中的`%(key)s`会被解析
config = configparser.ConfigParser(interpolation=configparser.BasicInterpolation())
config.read(file_path)
print(config.sections())
print(config.get("LogConfig", "log_path"))
# 对占位符${key}或${section:key}的识别,需指定interpolation为ExtendedInterpolation()
config2 = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation())
config2.read(file_path)
print(config2.sections())
print(config2.get("Log", "log_debug")) # /opt/log/debug
print(config2.get("LogF", "my_log_path")) # /opt/log/test/python
领取专属 10元无门槛券
私享最新 技术干货