configparser模块用于解析配置文件
from configparser import ExtendedInterpolation
from configparser import ConfigParser
from ast import literal_eval
def str_to_list(value):
"""
将字符串表示的列表转换为列表
:param value: 字符串表示的列表
:return: l
"""
l = literal_eval(value)
return l
config_str = """
[section 1]
key1 = value1 // 这是行内注释
# 这是单行注释
; 这是单行注释
key2 // allow_no_value=True时允许key没有value
[section 2]
key1 = '我是key1的value'
key2 = ${section 1:key1}s // 如果是同一section下的key,那么section名可以省略
l = [1, 2, 3]
i = 1
f = 8.8
b = true
"""
config_dict = {
'section 3': {'key1': 10, 'key2': 'value2', 'key3': [1, 2, 3]},
'section 4': {'key1': 88, 'key2': 'value2', 'key3': [11, 22, 33]}
}
# ---------------------------------ConfigParser------------------------------------------
cp = ConfigParser(defaults={'key 1': 'value1'}, # 设置default section的键和值,None表示空
allow_no_value=True, # 允许key没有value
delimiters=('=', ':'), # 键值对之间的分隔符
comment_prefixes=('#', ';',), # 单行注释标记
inline_comment_prefixes=('//',), # 行内注释标记
strict=True, # 使用严格模式时,不如许section和option有重复。
empty_lines_in_values=True, # value可以包含多行,空行也将视为value的一部分
default_section='DEFAULT', # 设置默认section的名字
interpolation=ExtendedInterpolation(), # 如果是默认的插值方法,格式为:%(key)s
converters={'s_to_l': str_to_list} # 自定义value的获取方法,将value传给自定义函数的第一个形参。调用方法为getfun())
)
# 读取配置信息,每个section都会有个默认option为key 1=value 1,该option无法被删除,可以被重新赋值。如果allow_no_value为True,则key 1=None
cp.read_string(config_str) # 读取字符串中的配信息,section和option之间必须要缩进。如果value跨行,value跨行部分要和key有缩进
# cp.read_dict(config_dict) # 读取字典中的配信息
# cp.read(filenames='read.ini', encoding='UTF-8')
# with open(file='read.ini', mode='r', encoding='UTF-8') as f1:
# cp.read_file(f1) # 读取file-like object中配置信息
# 获取section
print(cp['section 1'])
# 获取option的值
print(cp['section 1']['key1'])
# 返回default的字典
print(cp.defaults())
# 返回可用的section,不包含default
print(cp.sections())
# 返回section下的所有option列表(key列表)
print(cp.options('section 1'))
# 判断指定的section是否存在于配置中
print(cp.has_section('section 1'))
# 判断option是否存在于section
print(cp.has_option('section 1', 'key1'))
# 增加section,默认创建key 1的选项,section必须是不存在的,名字不能和default section的名字相同
cp.add_section('section 3')
print(11111, cp.options('section 3'))
# 如果section存在,给option设定值,option如果不存在则会自动创建一个
cp.set('section 3', 'key2', 'hello')
# 将section中的option强制转换为int,如果section或者option不存在,则返回fallback
print(cp.getint('section 2', 'i', fallback=None))
# 将section中的option强制转换为float,如果section或者option不存在,则返回fallback
print(cp.getfloat('section 2', 'f', fallback=None))
# 将section中的option强制转换为boolean,如果section或者option不存在,则返回fallback
print(cp.getboolean('section 2', 'b', fallback=None)) # '1',yes,true,on,'0',no,false,off会以大小写不敏感方式被检测
# 调用自定义的转换函数,函数指定在ConfigParser(converters={})
print(cp.gets_to_l('section 2', 'l', fallback=None))
# 当items()没给参数时,返回(section_name, section_proxy)
sect = cp.items()
for se in sect:
print(se)
# 当items(section, row)给参数时,返回(option_name, option_value)。raw=True,不显示插值;raw=False,显示插值;
opt = cp.items(section='section 2', raw=False)
for i in opt:
print(i)
# 移除指定section中的option
cp.remove_option('section 3', 'key2')
# 移除section
cp.remove_section('section 3')
# 将配置信息写入到配置文件内
with open(file='config.ini', mode='w', encoding='UTF-8') as f:
cp.write(f)
# ----------------------------------SectionProxy--------------------------------------------
# 获取SectionProxy
sp = cp['section 1']
# 返回ValuesView,可以通过遍历得到该section下所有的option_value
for i in sp.values():
print(i)
# 返回KeysView,可以通过遍历得到该section下所有的option_key
for i in sp.keys():
print(i)
# 返回ItemsView,可以通过遍历得到该section下所有的(option_name, option_value)
print(sp.items())
for i in sp.items():
print(i)
# 删除section中的最后一个option
sp.popitem()
# 通过指定key删除option
sp.pop('key2')
# 清空section,不会清除默认的option
sp.clear()