13.10 读取配置文件

    模块能被用来读取配置文件。例如,假设你有如下的配置文件:

    下面是一个读取和提取其中值的例子:

    1. >>> from configparser import ConfigParser
    2. >>> cfg = ConfigParser()
    3. >>> cfg.read('config.ini')
    4. ['config.ini']
    5. >>> cfg.sections()
    6. ['installation', 'debug', 'server']
    7. >>> cfg.get('installation','library')
    8. '/usr/local/lib'
    9. >>> cfg.getboolean('debug','log_errors')
    10.  
    11. True
    12. >>> cfg.getint('server','port')
    13. 8080
    14. 32
    15. >>> print(cfg.get('server','signature'))
    16.  
    17. \=================================
    18. Brought to you by the Python Cookbook
    19. \=================================
    20. >>>

    如果有需要,你还能修改配置并使用 cfg.write() 方法将其写回到文件中。例如:

    1. >>> cfg.set('server','port','9000')
    2. >>> cfg.set('debug','log_errors','False')
    3. >>> import sys
    4. >>> cfg.write(sys.stdout)

    配置文件作为一种可读性很好的格式,非常适用于存储程序中的配置数据。在每个配置文件中,配置数据会被分组(比如例子中的“installation”、 “debug” 和 “server”)。每个分组在其中指定对应的各个变量值。

    1. prefix=/usr/local
    2. prefix: /usr/local

    配置文件中的名字是不区分大小写的。例如:

    1. >>> cfg.get('installation','PREFIX')
    2. '/usr/local'
    3. >>> cfg.get('installation','prefix')
    4. >>>

    在解析值的时候, 方法查找任何可行的值。例如下面都是等价的:

    或许配置文件和Python代码最大的不同在于,它并不是从上而下的顺序执行。文件是安装一个整体被读取的。如果碰到了变量替换,它实际上已经被替换完成了。例如,在下面这个配置中,prefix 变量在使用它的变量之前或之后定义都是可以的:

    1. [installation]
    2. library=%(prefix)s/lib
    3. include=%(prefix)s/include
    4. bin=%(prefix)s/bin
    5. prefix=/usr/local

    有个容易被忽视的特性是它能一次读取多个配置文件然后合并成一个配置。例如,假设一个用户像下面这样构造了他们的配置文件:

    1. ; ~/.config.ini
    2. [installation]
    3. prefix=/Users/beazley/test
    4.  
    5. [debug]
    6. log_errors=False

    仔细观察下 prefix 变量是怎样覆盖其他相关变量的,比如 的设定值。产生这种结果的原因是变量的改写采取的是后发制人策略,以最后一个为准。你可以像下面这样做试验:

    1. >>> cfg.get('installation','library')
    2. '/Users/beazley/test/lib'
    3. >>> cfg.set('installation','prefix','/tmp/dir')
    4. >>> cfg.get('installation','library')
    5. >>>

    最后还有很重要一点要注意的是Python并不能支持.ini文件在其他程序(比如windows应用程序)中的所有特性。确保你已经参阅了configparser文档中的语法详情以及支持特性。

    原文: