目录
引入
INI文件结构
举例
读取配置
节点
获取所有节点
获取指定节点下的所有键
键值对
获取指定节点下的所有键值对
获取指定节点下键对应的值
布尔值获取与设置
检查配置
节点
检查节点是否存在
键值对
检查指定节点的键是否存在
添加配置
节点
添加节点
键值对
向指定节点中添加键值对
删除配置
节点
删除节点
键值对
删除指定节点的键值对
修改配置
修改指定节点的指定键的值
写入配置文件
总结
参考
配置文件在项目中是常见的,一般是.ini或xml等格式,例如,在mysql中就是my.ini进行配置。xml对于非计算机类的用户来说,不是很友好。
如果要你写一个配置文件解析器,你有什么思路呢?例如:
配置文件是由小节组成的,每个小节都有一个 [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"))
结果
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"))
结果:
打开
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']获取配置项,然后对程序进行设置。
configparse
更多python相关内容:【python总结】python学习框架梳理
本人b站账号:lady_killer9
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。