在写程序或者脚本的时候,常常要面临的一个问题就是配置文件的灵活性,如果一个程序中写满了绝对路径,那么这个程序在移植的时候将是非常头疼的。一个好的解决办法就是将这些程序运行所需要的配置文件以及一些设置放置到一个单独的配置文件中进行集中的管理,这样在程序移植到其他的地方的时候,我们只需要修改配置文件就可以解决移植性的问题了!
python中的一个常用包configparser就是为此而生,该包既可以用于写配置文件,也可以用于读取配置文件,我们接下来从这两个方面来介绍这个包吧!
书写文件:
import configparser
def makeconfig():
config = configparser.ConfigParser()
config['library'] = {}
config['library']['lib1'] = 'path1'
config['library']['lib2'] = 'path2'
config['library']['lib3'] = 'path3'
config['switch'] = {}
config['switch']['s1'] = 'on'
config['switch']['s2'] = 'yes'
config['DEFAULT'] = {}
config['DEFAULT']['lib3'] = 'path4'
with open('config.ini','w') as odata:
config.write(odata)
print("{} Has been generated".format('config.ini'))
if __name__ == '__main__':
makeconfig()
需要注意的点是在写出配置文件的时候,直接使用config实例的方法write来将文件写入到文件对象odata中。
然后我们可以查看一下生成的config.ini文件:
[DEFAULT]
lib3 = path4
[library]
lib1 = path1
lib2 = path2
lib3 = path3
[switch]
s1 = on
s2 = yes
可以看到,我们可以以一种建立字典的方式来写入配置内容,非常的方便,接下来我们看一下如何来读入这个配置文件呢?
def readconfig():
read_config = configparser.ConfigParser()
read_config.read('config.ini')
print(read_config.sections()) #['library', 'switch']
#lib = read_config.get('library') wrong way!
lib2 = read_config.get('library','lib2')
lib3 = read_config.get('library','lib3')
switch1 = read_config.getboolean('switch','s1')#yes no/true false/on off
switch2 = read_config.getboolean('switch','s2')
#print(lib)
print(lib2) #path2
print(lib3) #path3 #如果删除配置文件中library的lib3,将返回default中的lib3值
print(switch1) #True
print(switch2) #True
可以看到,我们这一次不需要打开文件了,我们直接给read方法一个文件路径就可以省去打开文件的过程了!
同时,我们可以使用get方法来获取字符串内容,使用getboolean()方法来获取boolean值。
如果此时我们删除配置文件中的library的lib3,那么返回的lib3将是default中定义的path4!这一点需要注意。原因是如果找不到一个值,那么就会去default中找,找到了就返回default中的值。体现了一个优先级的问题。