三、ConfigParse解析配置文件
一、引子
当我们在工作中,有很多命令行工具在工作时使用到配置文件呢,列如著名的版本管理工具git工作时会读取~/.gticonfig进行配置,Mysql数据库的客户端默认使用/etc/mysql/myc.cnf中的配置,pip命令的配置文件位于~/.pip/pip.conf中。
现在我们分析下配置文件的好处:配置成功后不需要每次使用时都指定相应的参数。而且,经典的ini格式的配置文件具有与编程语言无关,可读性强和易于处理等优点,已经被广泛使用。
二、ConnfigParse模块介绍
在Python语言中,标准库的ConfigParse模块用以解析配置文件(在Python3中,ConfigParse模块重命名为configparser模块,使用上有细微差异)。ConfigParse模块中包含了ConfigParser类,一个ConfigParser对象可以同时解析多个配置文件,一般情况下,我们只会使用ConfigParser解析一个配置文件。
解析配置案例
配置文件
[client]
port = 3306
user = mysql
password = mysql
host = 127.0.0.1
[mysqld]
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
skip=external=locking
利用configparser模块解析
allow_no_value:默认取值为False,表示在配置文件中是否允许选项没有值的情况
一、configparser判断配置项相关的方法:
- sections: 返回一个包含所有章节的列表
- has_section: 判断章节是否存在
- items: 以元组的形式返回所有选项
- optionns: 返回一个包含章节下所有选项的列表
- has_options: 判断某个选项是否存在
- get,getboolean,getint,getfloat: 获取选项的取值
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import configparser
cf = configparser.ConfigParser(allow_no_value=True)
cf.read('my.ini')
print(cf.sections()) # 返回一个所有章节的列表
print(cf.has_section('mysqld')) # 判断章节是否存在
print(cf.options('client')) # 返回一个包含章节下所有选项的列表
print(cf.has_option('client','user')) # 判断某个选项是否存在
print(cf.get('client','user')) # 获取选项的值
print(cf.getint('client','port'))
# run
/usr/local/bin/python3.6 /Users/xcn/PycharmProjects/自动化运维/使用Configparse解析配置文件/configparse模块.py
['client', 'mysqld']
True
['port', 'user', 'password', 'host']
True
mysql
3306
二、ConfigParser 修改配置文件的方法
在读取选项时,get方法默认以字符串的形式返回。如果我们需要读取一个整数,则使用getint方法读取;如果我们需要读取一个布尔型的取值,则使用getboolean方法读取。
修改配置方法如下:
- remove_section: 删除一个章节
- add_section: 添加一个章节
- remote_option: 删除一个选项
- set: 添加一个选项
- write将Configparser对象中的数据保存到文件中
import configparser
cf = configparser.ConfigParser(allow_no_value=True)
cf.read('my.ini')
print(cf.remove_section('client')) # 删除client章节
print(cf.add_section('mysql')) # 添加章节
print(cf.set('mysql','host','127.0.0.1')) # 添加一个选项
print(cf.set('mysql','port', '3306'))
cf.write(open('my.ini','w')) # 保存到文件中
# 修改后的文件
[mysqld]
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
skip = external=locking
[mysql]
host = 127.0.0.1
port = 3306