|
|
|
|
移动端

3.2 使用ConfigParse解析配置文件

《Python Linux系统管理与自动化运维》第3章打造命令行工具,本章介绍了如何使用Python语言解析ini格式的配置文件以及如何使用Python语言解析命令行参数,紧接着,本章介绍了Python标准库中的logging库,在本章最后,我们介绍了如何使用开源项目打造功能更加强大的命令行工具。本节为大家介绍使用ConfigParse解析配置文件。

作者:赖明星来源:机械工业出版社|2017-09-28 17:13


3.2 使用ConfigParse解析配置文件

将配置文件解析放到命令行这一章中进行介绍似乎有些奇怪。但是,确实有不少命令行工具在工作时使用到配置文件。例如,著名的版本管理工具git工作时会读取~/.gitconfig进行配置,MySQL数据库的客户端默认使用/etc/mysql/my.cnf中的配置,pip命令的配置文件位于~/.pip/pip.conf中。读者如果打造自己的命令行工具,也可以使用配置文件对工具进行配置。

配置文件的好处是,配置成功后不需要每次使用时都指定相应的参数。而且,典型的ini格式的配置文件具有与编程语言无关、可读性强和易于处理等优点,已经被广泛使用。

一个典型的配置文件包含一到多个章节(section),每个章节下可以包含一到多个选项(option)。下面的配置就是一个典型的MySQL配置文件。这个配置文件中包含了两个章节,在client这个章节中包含了4个选项。

  1. [client]  
  2. port        = 3306 
  3. user        = mysql 
  4. password    = mysql 
  5. host        = 127.0.0.1  
  6.  
  7. [mysqld]  
  8. basedir         = /usr  
  9. datadir         = /var/lib/mysql  
  10. tmpdir          = /tmp  
  11. skip-external-locking 

使用配置文件配置参数是很常见的需求,因此,各个语言都提供了相应的模块来解析配置文件,Python语言也不例外。在Python语言中,标准库的ConfigParser模块用以解析配置文件。ConfigParser模块中包含了一个ConfigParser类,一个ConfigParser对象可以同时解析多个配置文件,一般情况下,我们只会使用ConfigParser解析一个配置文件。ConfigParser类提供了很多的方法,我们可以使用这些方法解析、读取和修改配置文件。

要解析一个配置文件,首先需要创建一个ConfigParser对象。创建ConfigPaser时有多个参数,其中,比较重要的是allow_no_value。allow_no_value默认取值为False,表示在配置文件中是否允许选项没有值的情况。默认情况下,所有的选项都应该有一个值。但是,在一些特殊的应用中,选项存在就表示取值为真,选项不存在就表示取值为假。例如,在我们前面的MySQL配置文件中存在一个名为skip-external-locking的选项,该选项只有选项名称没有选项取值。因此,我们在解析这个配置文件时需要指定allow_no_value为True。

  1. In [1]: import ConfigParser  
  2.  
  3. In [2]: cf = ConfigParser.ConfigParser(allow_no_value=True

有了ConfigParser对象以后,可以使用read方法从配置文件中读取配置内容,也可以使用readfp方法从一个已经打开的文件中读取配置内容。

  1. In [3]: cf.read('my.cnf')  
  2. Out[3]: ['my.cnf'] 

ConfigParser中有很多的方法,其中与读取配置文件,判断配置项相关的方法有:

sections:返回一个包含所有章节的列表;

has_section:判断章节是否存在;

items:以元组的形式返回所有选项;

options:返回一个包含章节下所有选项的列表;

has_option:判断某个选项是否存在;

get、getboolean、getinit、getfloat:获取选项的值。

我们以前面的MySQL配置文件为例,测试各个方法的使用。如下所示:

  1. In [4]: cf.sections()  
  2. Out[4]: ['client', 'mysqld']  
  3.  
  4. In [5]: cf.has_section('client')  
  5. Out[5]: True  
  6.  
  7. In [6]: cf.options('client')  
  8. Out[6]: ['port', 'user', 'password', 'host']  
  9.  
  10. In [7]: cf.has_option('client', 'user')  
  11. Out[7]: True  
  12.  
  13. In [8]: cf.get('client', 'host')  
  14. Out[8]: '127.0.0.1'  
  15.  
  16. In [9]: cf.getint('client', 'port')  
  17. Out[9]: 3306 

在我们的配置文件中有2个章节,分别是client和mysqld。其中,client章节有4个选项。我们可以通过sections方法获取所有的章节,通过options方法获取某个章节下所有的选项,也可以通过has_section方法判断某个章节是否存在,通过has_option方法判断某个选项是否存在。

在读取选项的内容时,get方法默认以字符串的形式返回。如果我们需要读取一个整数,则使用getint方法读取;如果我们需要读取一个布尔型的取值,则使用getboolean方法读取。

ConfigParser也提供了许多方法便于我们修改配置文件。如下所示:

remove_section:删除一个章节;

add_section:添加一个章节;

remote_option:删除一个选项;

set:添加一个选项;

write将ConfigParser对象中的数据保存到文件中。

在下面的代码中,我们首先删除了client这个章节,然后增加了一个新的mysql章节。随后,我们在mysql章节中增加了两个选项。最后,我们调用write方法将选项保存到文件中。

  1. In [10]: cf.remove_section('client')  
  2. Out[10]: True  
  3.  
  4. In [11]: cf.add_section('mysql')  
  5.  
  6. In [12]: cf.set('mysql', 'host', '127.0.0.1')  
  7.  
  8. In [13]: cf.set('mysql', 'port', 3306)  
  9.  
  10. In [14]: cf.write(open('my_copy.cnf', 'w')) 

修改完成以后,新的my_copy.cnf文件内容如下:

  1. [mysqld]  
  2. basedir = /usr  
  3. datadir = /var/lib/mysql  
  4. tmpdir = /tmp  
  5. skip-external-locking  
  6.  
  7. [mysql]  
  8. host = 127.0.0.1  
  9. port = 3306 

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

开源osCommerce 轻松架设专业电子商务平台

osCommerce是一款免费的、开放源代码的专业电子商务解决方案。本书以通俗易懂的语言向读者展示了该软件强大的功能和简易的操作方法,主要内...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊