Python内置库:configparr(INI格式配置⽂件解析)
在平时的开发中感觉INI格式的配置⽂件使⽤还是挺需要的,有时会使⽤⼀个单独的py来存放⼀些常量或者配置项,⼤多时候这样倒是挺好⽤的,但是如果某些配置项需要在运⾏时由⽤户来修改指定,⽐如很多app在关闭时会有⼀个弹出框提⽰“是否关闭”和“下次不再提醒”,这种配置项如果使⽤INI格式的配置⽂件来操作的话就会⽅便很多,Python中操作配置⽂件的模块为configparr,这个模块可以⽤来解析与Windows上INI⽂件结构类似的⽂件。
看官⽅⽂档的时候发现不同Python版本之间某些API还是有些⼩区别的,所以先说⼀下,本⽂使⽤的是Python3.6。
⼀个普通的INI配置⽂件cfg.ini⽰例如下:
; DEFAULT为默认ction,当获取其他ction中同名option,⽽该ction⼜没有这个option时,会取DEFAULT中的该option
[DEFAULT]
clo_prompt = yes
[baidu]
website =
# 本机信息
[home]
ip = 127.0.0.1
port = 8080
INI配置⽂件组成:
ction:表⽰⼀个区块,由⽅括号及⽅括号中的名称组成,ction的范围为当前⽅括号到下⼀个⽅括号的内容,
如“DEFAULT”,“baidu”,“home”。
⼤⼩写和空格检查:ction中的名称在保存和获取的时候是原样保存和获取的,即⼤⼩写不⼀样或者空格不⼀样等都是不同的ction;
重复性检查:同⼀个配置⽂件中ction名称是不允许重复的。
option:表⽰ction中的配置项,由key、分隔符和value组成的键值对,如“home”下的“port=8080”。
⼤⼩写检查:key是⼤⼩写不敏感的,保存进⽂件的时候会⾃动将key⼩写保存,但value是⼤⼩写敏感的;
空格检查:通过key获取value时,会⾃动将⽂件中的key和value前后空格去掉再进⾏匹配,即⽂件中保存为' ip = 127.0.0.1 '时,⽤'ip'也可以获取到对应的value值'127.0.0.1';
跨多⾏检查:key是不能跨⾏的,但是value可以跨⾏,只要第⼆⾏即之后的⾏的缩进与第⼀⾏不同即可,⼀直到下⼀个option为⽌;
重复性检查:和ction⼀样,同⼀ction下的key是不允许重复的;
分隔符:可以是等号“=”或者冒号“:”。
注释:⾏注释⽤井号“#”或者分号“;”表⽰,特别需要注意的是必须得是⾏开头(前⾯可以有空格),⽤在⾏中间的就不会算作是注释了。
DEFAULT:这是⼀个特殊的ction,会⽤作其他ction的option取不到值时的备⽤值,或者可以理解为它是⼀个root,其他的ction 都是它的⼦ction,但不是必须提供的。
向配置⽂件中写数据:
unfo
# -*- coding:utf-8 -*-goals
from configparr import ConfigParrpba
# 使⽤字典的⽅式给配置对象添加配置信息
config = ConfigParr()
config['DEFAULT'] = {
'clo_prompt': 'yes',
}
config['baidu'] = {}
config['baidu']['website'] = ''
config['home'] = {}
home = config['home']
home['ip'] = '127.0.0.1'
home['port'] = '8080'
# 将配置信息写⼊⽂件
with open('cfg.ini', 'w') as cfg_file:
config.write(cfg_file)
从配置⽂件中读取数据:
# -*- coding:utf-8 -*-
from configparr import ConfigParr
# 以字典的⽅式读取配置对象中的数据
config = ConfigParr()
ions()) # 输出:[]
# 从配置⽂件中读取数据,如果配置⽂件中有中⽂信息,注意编码
上海宠物美容培训
生活大爆炸 第七季ad('cfg.ini', encoding='utf-8')
ions()) # 输出:['baidu', 'home']
print('baidu'in config) # 输出:True
print(config['baidu']['website']) # 输出:
home = config['home']
print(home['ip']) # 输出:127.0.0.1
for key in home:
print(key) # 依次输出:ip,port,clo_prompt
configparr.ConfigParr
从上⾯的例⼦可以看出ConfigParr实例可以像操作字典⼀样去操作它,每个ction对应⼀个由key/value组成的option字典,虽然可以通过添加和设置ction和option等⽅法来操作,但还是推荐使⽤字典的⽅式,可读性也要强⼀点。其实还有另⼀个解析类RawConfigParr,与ConfigParr的区别在于前者不允许进⾏字符串的格式化,⽽且后者也是继承⾃前者的,所以这⾥就只讲ConfigParr。(⾄于还有⼀个SafeConfigParr,在Python3.2之后就合道ConfigParr中,跟RawConfigParr和ConfigParr的区别在于可以跨ction进⾏字符串的格式化,这⾥也不讲了)
初始化⽅法:ConfigParr(defaults=None, dict_type=_default_dict, allow_no_value=Fal, *, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_ction=DEFAULTSECT, interpolation=_UNSET, converters=_UNSET):penny price
defaults:设置配置⽂件中名为DEFAULT的默认ction信息,默认为None,可以传⼊⼀个包含option信息的字典;
dict_type:设置读取配置信息时的字典类型,默认为有序字典,即collections.OrderedDict,如果实在要考虑性能等原因,可以使⽤python默认字典dict;
allow_no_value:是否允许key没有对应的value,默认为Fal,如果加载的配置⽂件中有这种情况,
需要⼿动设置为True;
delimiters:设置分隔符,默认为“=”和“:”,且⼀个option中第⼆个及之后的分隔符会算作value的⼀部分;
comment_prefixes:设置注释符,默认为“#”和“;”,即⼀⾏的开头(取出空格后)为“#”或者“;”,则这⼀⾏算作注释内容,包括value有多⾏的情况也是如此;
inline_comment_prefixes:设置⾏中的注释前缀,即⼀⾏中这个符号之后的内容被认为是注释;
strict:默认为True,即读取配置数据时不允许出现重复的ction和option;
empty_lines_in_values:是否允许value中出现空⾏,默认为True,如果设置为Fal,则value中的空⾏将作为这个option的结束标志;
default_ction:更改默认的ction名称,原本默认的ction是DEFAULT(注意更改操作需要在实例化之后,读取数据之前);
interpolation:设置value的字符串格式化功能,如果不想使⽤value的字符串格式化功能,可以设置None;
restored
converters:设置将value转换为特定类型的数据,参数值为⼀个字典,字典的key为转换⽅法的名称,value为对应的转换函数,提供这个字典后,会⾃动⽣成对应的get/t⽅法,⽐如提供⼀个字典{'int': int}就会⽣成getint转换⽅法(当然这个⽅法已经内置有了,这⾥只是举个例⼦)。
value字符串格式化:可以使⽤%(name)s进⾏字符串的格式化,且name只能是本ction和DEFAULT中的option项。
⾃定义option的key配置⽅式:如原本是key是⾃动转化为⼩写的,现在设置其区分⼤⼩写:parr.optionxform = lambda option: option(注意更改操作需要在实例化之后,读取数据之前)。
⾃定义ction⾃定义配置⽅式:如原本ction是包含了空格以及⼤⼩写区分的,现在利⽤正则表达式设置其去掉⾸位的空格:
parr.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]")(注意更改操作需要在实例化之后,读取数据之前)。
常⽤⽅法:
defaults():以字典的⽅式返回默认的ction,即DEFAULT;
ctions():返回ction名称的列表,但是不包括DEFAULT;
广州北大青鸟
add_ction(ction):添加⼀个ction,字符串类型,且已经存在的ction不能再往⾥添加;
has_ction(ction):判断当前配置中是否有此ction,DEFAULT不包含在此判断中;
options(ction):返回此ction下的option列表;
has_option(ction, option):如果指定的ction存在,且包含该option,则返回True,否则返回Fal;如果传⼊的ction为None或者空字符串,则使⽤DEFAULT这个ction进⾏查找判断;
read(filenames, encoding=None):可以传⼊单个⽂件,或者多个⽂件的列表,如果多个⽂件中某个⽂件⽆法打开,则这个⽂件会被忽略;
翻译器在线
read_file(f, source=None):从⼀个⽂件流(不是⽂件名称)读取配置,source为⽂件流的名称;
read_string(string, source='<string>'):从⼀个字符串读取配置,source为字符串的名称;
read_dict(dictionary, source='<dict>'):从⼀个类字典对象中读取配置信息,source为类字典对象的名称;
get(ction, option, *, raw=Fal, vars=None[, fallback]):获取ction下指定option的值,如果vars被
提供了(必须是⼀个字典),则按照vars、ction、DEFAULT这个顺序进⾏查找。raw指定为True时,option中value值不会⾃动进⾏格式化字符串的转换,直接返回原内容。fallback⽤于指定当查找的option没有时返回的默认值;
getint(ction, option, *, raw=Fal, vars=None[, fallback]):将get的值强转成int类型(raw、vars和fallback参数请参考get⽅法);
joyce是什么意思
getfloat(ction, option, *, raw=Fasle, vars=None[, ballback]):将get的值强转成float类型(raw、vars和fallback参数请参考get⽅法);
getboolean(ction, option, *, raw=Fal, vars=None[, fallback]):将get的值强转成boolean类型True或Fal,转换原则为yes/no、on/off、true/fal和1/0可以转换为True和Fal,其他项则会报错(raw、vars和fallback参数请参考get⽅法)。如果想要⾃定义转换为True或Fal的项,可以通过设置parr.BOOLEAN_STATES来定指定,如:parr.BOOLEAN_STATES = {'open': True, 'clo': Fal},但是这时候意味着没在这个字典中的项就会报错了,包括原来的yes/no等项;
items((raw=Fal, vars=None):返回ction的迭代器,包括DEFAULT(raw和vars参数请参考get⽅法);
items(ction, raw=Fal, vars=None):返回指定ction下option键值对元组的列表(raw和vars参数请参考get⽅法);
t(ction, option, value):给指定的ction设置⼀个option键值对;
write(fileobject, space_around_delimiters=True):将配置信息写进⼀个open的⽂件对象,space_around_delimiters为True时,option 的分隔符两边会有空格;
remove_option(ction, option):移除指定ction下的指定option,成功返回True,否则返回Fal;
remove_ction(ction):移除⼀个ction,如果存在且移除成功,则返回True,否则返回Fal。