三、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


posted @ 2018-06-10 10:18  云原生运维社区  阅读(1202)  评论(0编辑  收藏  举报