目录
引入
配置文件在项目中是常见的,一般是.ini或xml等格式,例如,在mysql中就是my.ini进行配置。xml对于非计算机类的用户来说,不是很友好。
如果要你写一个配置文件解析器,你有什么思路呢?例如:
- 文件结构规定,规定参数和值、规定注释
- 读取配置文件的配置项,配置文件的参数、值的分隔符规定,注释规定等
- 删除配置文件的配置项
- 修改配置文件的配置项
- 添加配置文件的配置项
- 检查配置文件的配置项
- ...
INI文件结构
配置文件是由小节组成的,每个小节都有一个 [section] 标头,加上多个由特定字符串 (默认为 = 或 :) 分隔的键/值条目。 默认情况下小节名对大小写敏感而键对大小写不敏感 。键和值开头和末尾的空格会被移除。 值可以被省略,在此情况下键/值分隔符也可以被省略。 值还可以跨越多行,只要其他行带有比值的第一行更深的缩进。 依据解析器的具体模式,空白行可能被视为多行值的组成部分也可能被忽略。
配置文件可以包含注释,要带有指定字符前缀 (默认为 # 或 ;)。 注释可以单独出现于原本的空白行,并可使用缩进。
mysql的简单配置
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=D:\mysql-5.7.20-win32\mysql-5.7.20-win32
# 设置mysql数据库的数据的存放目录
datadir=D:\mysql-5.7.20-win32\mysql-5.7.20-win32\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
有两个小节,一个是mysql,一个是mysqld。这里使用#来代表后面的是注释,使用=来分隔参数和值。
举例
我们来对mysql的配置文件进行解析
import configparser
configfile = configparser.ConfigParser()
configfile.read(r"D:\mysql-5.7.20-win32\mysql-5.7.20-win32\my.ini")
print(configfile["mysql"]["default-character-set"])
一般情况下,我们就是得到配置文件的配置项,然后对程序进行配置。当然,也可能在软件刚打开时,用户设置一下,写入配置文件。所以,增删改查是少不了的。接下来,详细看看。
['BOOLEAN_STATES', 'NONSPACECRE', 'OPTCRE', 'OPTCRE_NV', 'SECTCRE', 'add_section', 'clear', 'converters', 'default_section', 'defaults', 'get', 'getboolean', 'getfloat', 'getint', 'ha
s_option', 'has_section', 'items', 'keys', 'options', 'optionxform', 'pop', 'popitem', 'read', 'read_dict', 'read_file', 'read_string', 'readfp', 'remove_option', 'remove_section', 's
ections', 'set', 'setdefault', 'update', 'values', 'write']
读取配置
节点
获取所有节点
print(configfile.sections())
结果
['mysql', 'mysqld']
获取指定节点下的所有键
print(configfile.options("mysqld"))
结果
['port', 'basedir', 'datadir', 'max_connections', 'character-set-server', 'default-storage-engine']
键值对
获取指定节点下的所有键值对
print(configfile.items("mysqld"))
结果
[('port', '3306'), ('basedir', 'D:\\mysql-5.7.20-win32\\mysql-5.7.20-win32'), ('datadir', 'D:\\mysql-5.7.20-win32\\mysql-5.7.20-win32\\data'), ('max_connections', '200'), ('character-
set-server', 'utf8'), ('default-storage-engine', 'INNODB')]
获取指定节点下键对应的值
mysqld = configfile["mysqld"]
print(mysqld.get("datadir"))
结果
D:\mysql-5.7.20-win32\mysql-5.7.20-win32\data
布尔值获取与设置
从前面可以看到,所有的键和值都认为是字符串。那么如何获取布尔值呢?
官方给了getboolean函数
在配置文件中,添加
#布尔值
bool = False
print(type(mysqld.getboolean("bool")), mysqld.getboolean("bool"))
结果
<class 'bool'> False
配置解析器会将下列值视为 True
: '1'
, 'yes'
, 'true'
, 'on'
而将下列值视为 False
: '0'
, 'no'
, 'false'
, 'off'
。
有的时候,可能配置简单,懒得写配置功能,直接让用户来修改配置文件,通过注释来提示用户。但是off、false等对非计算机专业用户来说有些难。我们可以修改一下布尔值的判定
配置文件中添加:
# 是否开启命运之门? 打开或关闭
Door of Destiny = 打开
代码添加:
# 设置布尔值
configfile.BOOLEAN_STATES["打开"] = True
configfile.BOOLEAN_STATES["关闭"] = False
print(mysqld.get("Door of Destiny"))
print(type(mysqld.getboolean("Door of Destiny")), mysqld.getboolean("Door of Destiny"))
结果:
打开
<class 'bool'> True
对于float、int,可以使用getfloat和getint,也可以自己使用int、float进行转换
检查配置
在查看、添加、删除、修改之前,我们都应该检查一下是否存在。
节点
检查节点是否存在
print(configfile.has_section("mysql"))
print(configfile.has_section("yoursql"))
结果
True
False
键值对
检查指定节点的键是否存在
print(configfile.has_option("mysqld", "default-character-set"))
print(configfile.has_option("mysqld", "port"))
结果
False
True
添加配置
节点
添加节点
configfile.add_section("delete")
configfile.add_section("info")
键值对
向指定节点中添加键值对
configfile.set("info", "author", "lady_killer9")
configfile.set("info", "time", "now")
删除配置
节点
删除节点
configfile.remove_section("delete")
键值对
删除指定节点的键值对
configfile.remove_option("info", "time")
修改配置
修改指定节点的指定键的值
和添加一样
configfile.set("info", "author", "frankyu")
写入配置文件
以上的添加、删除、修改只是在内存中,需要写到文件中使用write,传入文件函数
configfile.write(open(r"D:\mysql-5.7.20-win32\mysql-5.7.20-win32\my.ini", "w"))
总结
配置文件解析类似字典,实现了增加、删除、修改、查看、检查功能,一般我们会通过parser['section']['option']获取配置项,然后对程序进行设置。
参考
更多python相关内容:【python总结】python学习框架梳理
本人b站账号:lady_killer9
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。