geekdoc-python-zh/docs/pythonlibrary/python-101-an-intro-to-conf...

7.9 KiB
Raw Permalink Blame History

python 101:config parser 简介

原文:https://www.blog.pythonlibrary.org/2013/10/25/python-101-an-intro-to-configparser/

用户和程序员都使用配置文件。它们通常用于存储应用程序的设置甚至是操作系统的设置。Python 的核心库包括一个名为 ConfigParser 的模块,您可以使用它来创建配置文件并与之交互。在本文中,我们将花几分钟时间了解它是如何工作的。

注意:本文中的例子使用的是 Python 2。在 Python 3 中ConfigParser 被重命名为 configparser。

创建配置文件

用 ConfigParser 创建配置文件非常简单。让我们创建一些代码来演示:


import ConfigParser

#----------------------------------------------------------------------
def createConfig(path):
    """
    Create a config file
    """
    config = ConfigParser.ConfigParser()
    config.add_section("Settings")
    config.set("Settings", "font", "Courier")
    config.set("Settings", "font_size", "10")
    config.set("Settings", "font_style", "Normal")
    config.set("Settings", "font_info",
               "You are using %(font)s at %(font_size)s pt")

    with open(path, "wb") as config_file:
        config.write(config_file)

#----------------------------------------------------------------------
if __name__ == "__main__":
    path = "settings.ini"
    createConfig(path)

上面的代码将创建一个配置文件,其中一个部分标记为 Settings ,包含四个选项:font、font_size、font_style 和 font_info。还要注意当我们将配置写入磁盘时我们使用“wb”标志以二进制模式写入。这不是必需的但是官方文档示例就是这样做的。您也可以使用普通的“w”标志它仍然可以工作。我在文档中找不到任何东西来解释其中的原因。

如何读取、更新和删除选项

现在我们正在阅读学习如何阅读配置文件,更新它的选项,甚至如何删除选项。在这种情况下,通过实际编写一些代码来学习更容易!只需将下面的函数添加到您上面编写的代码中。


import ConfigParser
import os

#----------------------------------------------------------------------
def crudConfig(path):
    """
    Create, read, update, delete config
    """
    if not os.path.exists(path):
        createConfig(path)

    config = ConfigParser.ConfigParser()
    config.read(path)

    # read some values from the config
    font = config.get("Settings", "font")
    font_size = config.get("Settings", "font_size")

    # change a value in the config
    config.set("Settings", "font_size", "12")

    # delete a value from the config
    config.remove_option("Settings", "font_style")

    # write changes back to the config file
    with open(path, "wb") as config_file:
        config.write(config_file)

#----------------------------------------------------------------------
if __name__ == "__main__":
    path = "settings.ini"
    crudConfig(path)

这段代码首先检查配置文件的路径是否存在。如果没有,那么它使用我们之前创建的 createConfig 函数来创建它。接下来,我们创建一个 ConfigParser 对象,并向其传递要读取的配置文件路径。为了读取配置文件中的选项,我们调用我们的 ConfigParser 对象的 get 方法,向它传递节名和选项名。这将返回选项的值。如果你想改变一个选项的值,那么你可以使用 set 方法,在这里你传递节名、选项名和新值。最后,您可以使用 remove_option 方法来删除一个选项。

在我们的示例代码中,我们将 font_size 的值更改为“12 ”,并完全删除了 font_style 选项。然后,我们将更改写回磁盘。

虽然这不是一个很好的例子,但是你不应该有一个函数像这个函数一样做所有的事情。所以让我们把它分成一系列的功能:


import ConfigParser
import os

def create_config(path):
    """
    Create a config file
    """
    config = ConfigParser.ConfigParser()
    config.add_section("Settings")
    config.set("Settings", "font", "Courier")
    config.set("Settings", "font_size", "10")
    config.set("Settings", "font_style", "Normal")
    config.set("Settings", "font_info",
               "You are using %(font)s at %(font_size)s pt")

    with open(path, "wb") as config_file:
        config.write(config_file)

def get_config(path):
    """
    Returns the config object
    """
    if not os.path.exists(path):
        create_config(path)

    config = ConfigParser.ConfigParser()
    config.read(path)
    return config

def get_setting(path, section, setting):
    """
    Print out a setting
    """
    config = get_config(path)
    value = config.get(section, setting)
    print "{section} {setting} is {value}".format(
        section=section, setting=setting, value=value)
    return value

def update_setting(path, section, setting, value):
    """
    Update a setting
    """
    config = get_config(path)
    config.set(section, setting, value)
    with open(path, "wb") as config_file:
        config.write(config_file)

def delete_setting(path, section, setting):
    """
    Delete a setting
    """
    config = get_config(path)
    config.remove_option(section, setting)
    with open(path, "wb") as config_file:
        config.write(config_file)

#----------------------------------------------------------------------
if __name__ == "__main__":
    path = "settings.ini"
    font = get_setting(path, 'Settings', 'font')
    font_size = get_setting(path, 'Settings', 'font_size')

    update_setting(path, "Settings", "font_size", "12")

    delete_setting(path, "Settings", "font_style")

与第一个例子相比,这个例子进行了大量的重构。我甚至用 PEP8 来命名函数。每个函数都应该是自解释和自包含的。我们没有将所有的逻辑放入一个函数中,而是将它分成多个函数,然后在底层的 if 语句中演示它们的功能。现在您可以导入该模块并自己使用它。

请注意,本例中的部分是硬编码的,因此您需要进一步更新本例,使其完全通用。

如何使用插值

ConfigParser 模块还允许插值,这意味着您实际上可以使用一些选项来构建另一个选项。我们实际上是用 font_info 选项来实现的,因为它的值是基于 font 和 font_size 选项的。我们实际上可以使用 Python 字典来更改插值。让我们花点时间来证明这两个事实。


import ConfigParser

#----------------------------------------------------------------------
def interpolationDemo(path):
    """"""
    if not os.path.exists(path):
        createConfig(path)

    config = ConfigParser.ConfigParser()
    config.read(path)

    print config.get("Settings", "font_info")

    print config.get("Settings", "font_info", 0,
                     {"font": "Arial", "font_size": "100"})

#----------------------------------------------------------------------
if __name__ == "__main__":
    path = "settings.ini"
    interpolationDemo(path)

如果运行此代码,您应该会看到类似如下的输出:


You are using Courier at 12 pt
You are using Arial at 100 pt

包扎

至此,您应该对 ConfigParser 的功能有了足够的了解,可以在自己的项目中使用它。还有另一个名为 ConfigObj 的项目,它不是 Python 的一部分您可能也想看看。ConfigObj 比 ConfigParser 更灵活,功能更多。但是如果您有困难或者您的组织不允许第三方软件包,那么 ConfigParser 可能会满足您的要求。

附加阅读