在平时的开发中感受INI格式的配置文件使用仍是挺须要的,有时会使用一个单独的py来存放一些常量或者配置项,大多时候这样却是挺好用的,可是若是某些配置项须要在运行时由用户来修改指定,好比不少app在关闭时会有一个弹出框提示“是否关闭”和“下次再也不提醒”,这种配置项若是使用INI格式的配置文件来操做的话就会方便不少,Python中操做配置文件的模块为configparser,这个模块能够用来解析与Windows上INI文件结构相似的文件。html
官方文档:https://docs.python.org/3/library/configparser.htmlpython
看官方文档的时候发现不一样Python版本之间某些API仍是有些小区别的,因此先说一下,本文使用的是Python3.6。web
一个普通的INI配置文件cfg.ini示例以下:正则表达式
; DEFAULT为默认section,当获取其余section中同名option,而该section又没有这个option时,会取DEFAULT中的该option
[DEFAULT]
close_prompt = yes
[baidu]
website = www.baidu.com
# 本机信息 [home]
ip = 127.0.0.1
port = 8080
INI配置文件组成:app
- section:表示一个区块,由方括号及方括号中的名称组成,section的范围为当前方括号到下一个方括号的内容,如“DEFAULT”,“baidu”,“home”。
- 大小写和空格检查:section中的名称在保存和获取的时候是原样保存和获取的,即大小写不同或者空格不同等都是不一样的section;
- 重复性检查:同一个配置文件中section名称是不容许重复的。
- option:表示section中的配置项,由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为止;
- 重复性检查:和section同样,同一section下的key是不容许重复的;
- 分隔符:能够是等号“=”或者冒号“:”。
- 注释:行注释用井号“#”或者分号“;”表示,特别须要注意的是必须得是行开头(前面能够有空格),用在行中间的就不会算做是注释了。
- DEFAULT:这是一个特殊的section,会用做其余section的option取不到值时的备用值,或者能够理解为它是一个root,其余的section都是它的子section,但不是必须提供的。
向配置文件中写数据:函数
# -*- coding:utf-8 -*-
from configparser import ConfigParser
# 使用字典的方式给配置对象添加配置信息
config = ConfigParser()
config['DEFAULT'] = {
'close_prompt': 'yes',
}
config['baidu'] = {}
config['baidu']['website'] = 'www.baidu.com'
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 configparser import ConfigParser
# 以字典的方式读取配置对象中的数据
config = ConfigParser()
print(config.sections()) # 输出:[]
# 从配置文件中读取数据,若是配置文件中有中文信息,注意编码
config.read('cfg.ini', encoding='utf-8')
print(config.sections()) # 输出:['baidu', 'home']
print('baidu' in config) # 输出:True
print(config['baidu']['website']) # 输出:www.baidu.com
home = config['home']
print(home['ip']) # 输出:127.0.0.1
for key in home:
print(key) # 依次输出:ip,port,close_prompt
configparser.ConfigParser编码
从上面的例子能够看出ConfigParser实例能够像操做字典同样去操做它,每一个section对应一个由key/value组成的option字典,虽然能够经过添加和设置section和option等方法来操做,但仍是推荐使用字典的方式,可读性也要强一点。其实还有另外一个解析类RawConfigParser,与ConfigParser的区别在于前者不容许进行字符串的格式化,并且后者也是继承自前者的,因此这里就只讲ConfigParser。(至于还有一个SafeConfigParser,在Python3.2以后就合道ConfigParser中,跟RawConfigParser和ConfigParser的区别在于能够跨section进行字符串的格式化,这里也不讲了)spa
初始化方法:ConfigParser(defaults=None, dict_type=_default_dict, allow_no_value=False, *, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=DEFAULTSECT, interpolation=_UNSET, converters=_UNSET):code
- defaults:设置配置文件中名为DEFAULT的默认section信息,默认为None,能够传入一个包含option信息的字典;
- dict_type:设置读取配置信息时的字典类型,默认为有序字典,即collections.OrderedDict,若是实在要考虑性能等缘由,可使用python默认字典dict;
- allow_no_value:是否容许key没有对应的value,默认为False,若是加载的配置文件中有这种状况,须要手动设置为True;
- delimiters:设置分隔符,默认为“=”和“:”,且一个option中第二个及以后的分隔符会算做value的一部分;
- comment_prefixes:设置注释符,默认为“#”和“;”,即一行的开头(取出空格后)为“#”或者“;”,则这一行算做注释内容,包括value有多行的状况也是如此;
- inline_comment_prefixes:设置行中的注释前缀,即一行中这个符号以后的内容被认为是注释;
- strict:默认为True,即读取配置数据时不容许出现重复的section和option;
- empty_lines_in_values:是否容许value中出现空行,默认为True,若是设置为False,则value中的空行将做为这个option的结束标志;
- default_section:更改默认的section名称,本来默认的section是DEFAULT(注意更改操做须要在实例化以后,读取数据以前);
- interpolation:设置value的字符串格式化功能,若是不想使用value的字符串格式化功能,能够设置None;
- converters:设置将value转换为特定类型的数据,参数值为一个字典,字典的key为转换方法的名称,value为对应的转换函数,提供这个字典后,会自动生成对应的get/set方法,好比提供一个字典{'int': int}就会生成getint转换方法(固然这个方法已经内置有了,这里只是举个例子)。
value字符串格式化:可使用%(name)s进行字符串的格式化,且name只能是本section和DEFAULT中的option项。
自定义option的key配置方式:如本来是key是自动转化为小写的,如今设置其区分大小写:parser.optionxform = lambda option: option(注意更改操做须要在实例化以后,读取数据以前)。
自定义section自定义配置方式:如本来section是包含了空格以及大小写区分的,如今利用正则表达式设置其去掉首位的空格:parser.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]")(注意更改操做须要在实例化以后,读取数据以前)。
经常使用方法:
- defaults():以字典的方式返回默认的section,即DEFAULT;
- sections():返回section名称的列表,可是不包括DEFAULT;
- add_section(section):添加一个section,字符串类型,且已经存在的section不能再往里添加;
- has_section(section):判断当前配置中是否有此section,DEFAULT不包含在此判断中;
- options(section):返回此section下的option列表;
- has_option(section, option):若是指定的section存在,且包含该option,则返回True,不然返回False;若是传入的section为None或者空字符串,则使用DEFAULT这个section进行查找判断;
- read(filenames, encoding=None):能够传入单个文件,或者多个文件的列表,若是多个文件中某个文件没法打开,则这个文件会被忽略;
- read_file(f, source=None):从一个文件流(不是文件名称)读取配置,source为文件流的名称;
- read_string(string, source='<string>'):从一个字符串读取配置,source为字符串的名称;
- read_dict(dictionary, source='<dict>'):从一个类字典对象中读取配置信息,source为类字典对象的名称;
- get(section, option, *, raw=False, vars=None[, fallback]):获取section下指定option的值,若是vars被提供了(必须是一个字典),则按照vars、section、DEFAULT这个顺序进行查找。raw指定为True时,option中value值不会自动进行格式化字符串的转换,直接返回原内容。fallback用于指定当查找的option没有时返回的默认值;
- getint(section, option, *, raw=False, vars=None[, fallback]):将get的值强转成int类型(raw、vars和fallback参数请参考get方法);
- getfloat(section, option, *, raw=Fasle, vars=None[, ballback]):将get的值强转成float类型(raw、vars和fallback参数请参考get方法);
- getboolean(section, option, *, raw=False, vars=None[, fallback]):将get的值强转成boolean类型True或False,转换原则为yes/no、on/off、true/false和1/0能够转换为True和False,其余项则会报错(raw、vars和fallback参数请参考get方法)。若是想要自定义转换为True或False的项,能够经过设置parser.BOOLEAN_STATES来定指定,如:parser.BOOLEAN_STATES = {'open': True, 'close': False},可是这时候意味着没在这个字典中的项就会报错了,包括原来的yes/no等项;
- items((raw=False, vars=None):返回section的迭代器,包括DEFAULT(raw和vars参数请参考get方法);
- items(section, raw=False, vars=None):返回指定section下option键值对元组的列表(raw和vars参数请参考get方法);
- set(section, option, value):给指定的section设置一个option键值对;
- write(fileobject, space_around_delimiters=True):将配置信息写进一个open的文件对象,space_around_delimiters为True时,option的分隔符两边会有空格;
- remove_option(section, option):移除指定section下的指定option,成功返回True,不然返回False;
- remove_section(section):移除一个section,若是存在且移除成功,则返回True,不然返回False。