Python configparser的使用

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()

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M_qsqsqsq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值