在软件开发过程中,很多时候需要处理配置文件的读取解析和改写,在python中专门处理配置文件的模块就是configpaser了。顾名思义,configpaser就是配置解析器,可用来对符合格式规范的.conf,ini等配置文件进行解析读取,并支持增删改查、定义新的配置文件等处理。
可以被configpaser处理的配置文件需符合以下格式规范:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
character-set-server=utf8
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
细心的同学可发现这就是mysql的默认配置文件,类似的还有ansible的hosts文件:
[group1]
host1 var1=value1 var2=value2
host2 var3=value2
[group2]
host3
[group1:children]
group2
前文提到,configpaser支持对配置文件的解析读取、增删改查和定义新的配置文件等处理,可满足不同场景下对配置文件的处理需求,下面我们先来创建一个示例配置文件,然后逐一详述读取和增删改查用法。
创建示例配置文件
import configparser
config = configparser.ConfigParser()
# 开始创建第一个section,类似于list赋值方式,值为dict
config['DEFAULT'] = {'compressionlevel': '9',
'serveraliveinterval': '45',
'compression': 'yes'}
config['DEFAULT']['forwardx11'] = 'yes'
# 创建第二个section
config['bitbucket.org'] = {}
# 类似于通过list的下标来赋值元素
config['bitbucket.org']['user'] = 'hg'
config['topsecret.server.com'] = {}
# 通过中间变量来替代
topsecret = config['topsecret.server.com']
topsecret['host port'] = '50022'
topsecret['forwardx11'] = 'no'
# 开始写入配置文件
with open('test.conf', 'w', encoding='utf-8') as configfile:
config.write(configfile)
注意:
创建的key-value中里面如果有数字,需要加引号变成string形式,否则会报数据类型错误。
创建的配置文件显示如下:
[DEFALUT]
compressionlevel = 9
serveraliveinterval = 45
compression = yes
forwardx11 = yes
[bitbucket.org]
user = hg
[topsecret.server.com]
host port = 50022
forwardx11 = no
很多场景下我们更多的是需要解析读取其他软件的配置文件,以获取相关的参数信息。
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.sections() #获取section
[]
>>> config.read('test.conf') #读取配置文件
['test.conf']
>>> config.sections() #成功返回section,但不包括default
['bitbucket.org', 'topsecret.server.com']
>>> config.defaults() #返回default section的键值对
OrderedDict([('compressionlevel', '9'), ('serveraliveinterval', '45'), ('compression', 'yes'), ('forwardx11', 'yes')])
>>> 'bitbucket.org' in config
True
>>> 'bitbucket.org1' in config
False
>>> 'DEFAULT' in config
True
>>>
>>> config.options('bitbucket.org')
['user', 'compressionlevel', 'serveraliveinterval', 'compression', 'forwardx11']
>>> config.items('bitbucket.org')
[('compressionlevel', '9'), ('serveraliveinterval', '45'), ('compression', 'yes'),('forwardx11', 'yes'), ('user', 'hg')]
>>> config['bitbucket.org']['user']
'hg'
>>>
>>> for key in config['bitbucket.org']:
... print(key)
...
user
compressionlevel
serveraliveinterval
compression
forwardx11
>>>
>>> for key in config.options('bitbucket.org'):
... print(key)
...
user
compressionlevel
serveraliveinterval
compression
forwardx11
参数 | 说明 |
---|---|
-read(filename) | 直接读取文件内容 |
-sections() | 得到所有的section,并以列表的形式返回 |
-options(section) | 得到该section的所有option |
-items(section) | 得到该section的所有键值对 |
-get(section,option) | 得到section中option的值,返回为string类型 |
-getint(section,option) | 得到section中option的值,返回为int类型,还有相应的getboolean()和getfloat() 函数。 |
import configparser
config = configparser.ConfigParser()
config.read('test.conf')
print(config.sections())
print(config.options('topsecret.server.com'))
print(config.items('topsecret.server.com'))
print(config.get('topsecret.server.com', 'host port'))
print(type(config.get('topsecret.server.com', 'host port')))
print(config.getint('topsecret.server.com', 'host port'))
print(type(config.getint('topsecret.server.com', 'host port')))
输出:
['bitbucket.org', 'topsecret.server.com']
['host port', 'forwardx11', 'compressionlevel', 'serveraliveinterval', 'compression']
[('compressionlevel', '9'), ('serveraliveinterval', '45'), ('compression', 'yes'), ('forwardx11', 'no'), ('host port', '50022')]
50022
<class 'str'>
50022
<class 'int'>
注意:
default是一个特殊的全局section,我们获取section时不会返回它,但是当我们在获取其他section的key或者key-value对时,会包括default相应的内容,可以认为它是一个全局缺省的section把。
import configparser
config = configparser.ConfigParser()
config.read('test.conf')
print(config.get('topsecret.server.com', 'host port'))
config.set('topsecret.server.com', 'host port' ,'60022')
print(config.get('topsecret.server.com', 'host port'))
结果输出:
50022
60022
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.read('test.conf')
['test.conf']
>>> config.has_section('topsecret.server.com')
True
>>> config.has_section('sync_data') #判断是否有该section
False
>>> config.options('topsecret.server.com')
['host port', 'forwardx11', 'compressionlevel', 'serveraliveinterval', 'compress
ion']
>>> config.add_section('sync_data') #新增section
>>> config.sections() #新增成功
['bitbucket.org', 'topsecret.server.com', 'sync_data']
import configparser
config = configparser.ConfigParser()
config.read('test.conf')
print(config.options('topsecret.server.com'))
#新增option autoreload
config.set('topsecret.server.com', 'autoreload' ,'yes')
print(config.options('topsecret.server.com'))
print(config.items('topsecret.server.com'))
程序输出:
['host port', 'forwardx11', 'compressionlevel', 'serveraliveinterval', 'compression']
['host port', 'forwardx11', 'autoreload', 'compressionlevel', 'serveraliveinterval', 'compression']
[('compressionlevel', '9'), ('serveraliveinterval', '45'), ('compression', 'yes'), ('forwardx11', 'no'), ('host port', '50022'), ('autoreload', 'yes')]
#新增option后可以看到多出autoreload,items也能返回它对应的value
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.read('test.conf')
['test.conf']
>>> config.sections()
['bitbucket.org', 'topsecret.server.com']
#开始删除section
>>> config.remove_section('bitbucket.org')
True
>>> config.sections()
['topsecret.server.com'] #成功删除section
>>> config.options('topsecret.server.com')
['host port', 'forwardx11', 'compressionlevel', 'serveraliveinterval', 'com
ion']
#开始删除option
>>> config.remove_option('topsecret.server.com','host port')
True
>>> config.options('topsecret.server.com')
['forwardx11', 'compressionlevel', 'serveraliveinterval', 'compression'] #成功删除option
#删除默认的default的option失败
>>> config.remove_option('topsecret.server.com','compression')
False
>>> config.options('topsecret.server.com')
['forwardx11', 'compressionlevel', 'serveraliveinterval', 'compression']
注意:如果要删除default的全局默认option,必须指定section为default后才能删除
>>> config.remove_option('DEFAULT','compression')
True
>>> config.options('topsecret.server.com')
['forwardx11', 'compressionlevel', 'serveraliveinterval']
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.read('test.conf')
>>> with open('test.conf','w',encoding='utf-8') as configfile:
... config.write(configfile)
...
>>> config.read('test.conf')
['test.conf']
#持久化保存后重新读取,此前的修改已经生效
>>> config.sections()
['topsecret.server.com']
>>> config.options('topsecret.server.com')
['forwardx11', 'compressionlevel', 'serveraliveinterval']
持久化保存时可指定保存到源文件进行覆盖写处理,也可以另存为其他文件。
转载自:http://www.cnblogs.com/linupython/p/8424985.html