简介

开发人员每天都在处理一些大型而复杂的项目, 而配置文件会帮到我们并节省不少时间。在处理配置文件过程中,无需更改源代码本身,只需要调整配置文件即可访问不同的API接口、更新基础URL信息或其它事情。

尽管可以通过多种方式来支持软件中的配置文件,包括JSON,YAML和纯文本文件,但本文旨在向您介绍 Python 标准库中的configparser模块。

注意:本文基于Python 3.9.0(CPython)。可以在GitHub上找到源代码。(https://github.com/DahlitzFlorian/how-to-work-with-config-files-in-python-article-snippets)

文件结构

在编写代码之前,让我们看一下实际配置文件的结构。

[DEFAULT]

admin_page = no

landing_page = yes

moderator_page = no # looks good here

[moderator]

moderator_page = yes

[admin]

admin_page = yes

moderator_page = yes

在当前的示例中,我们有一个名为config.ini的配置文件。它由三个部分组成,每个部分都由一个标题和一个键-值对列表组成,该标题封装在方括号内。

moderator和admin模块只是键值对的集合,但DEFAULT模块(第一个模块)有些特殊。如果其他模块之一未提供某个键的值,则它就会包含默认值。因此,如果您想尝试访问其他模块中的值,但该键不存在,则解析器将从默认部分(如果存在)中返回该值,而不是引发KeyError。

在本例中,我们通过此配置文件管理用户的页面访问。因此,默认部分代表普通用户的权限,而moderator和admin模块分别包含协管员和管理员的权限。

访问文件的内容

ConfigParser对象是主要的配置解析器和configparser模块的主要对象。您可以使用映射协议实现自己的配置解析器,让我们继续看看本文中的ConfigParser。

尽管ConfigParser接受很多参数,但我们将使用本文的默认值。让我们在工作目录中创建一个名为parser_playground.py的新文件。首先,我们从configparser模块导入ConfigParser类,并创建该类的实例。

# parser_playground.py

from configparser import ConfigParser

config = ConfigParser()

我们的配置对象不包含任何信息, 要更改此设置,我们需要先读取config.ini文件。这可以通过调用ConfigParser实例(此处为config)的read()方法来完成。

# previous code in parser_playground.py

config.read("config.ini")

读取配置文件后,我们可以开始探索如何访问其中存储的信息。首先,我们要列出所有可用的部分。这可以通过使用ConfigParser的sections()方法来实现:

# previous code in parser_playground.py

print(f"Sections: {config.sections()}") # Sections: ['moderator', 'admin']

此外,我们可以使用解析器的has_section()方法检查某个模块是否存在:

# previous code in parser_playground.py

print(f'Does a section called "admin" exist: {config.has_section("admin")}') # True

print(f'Does a section called "user" exist: {config.has_section("user")}') # False

print(f'Does a section called "DEFAULT" exist: {config.has_section("DEFAULT")}') # False

注意:调用sections()方法时,既未列出默认模块·,也没有被has_section()方法确认。

接下来,我们要访问各个值。但是在使用其标识符访问特定值之前,我们可以使用options()方法列出一个模块的所有可用选项,并提供模块名作为参数:

# Previous code in parser_playground.py

print(f'Options: {config.options("admin")}') # Options: ['admin_page', 'moderator_page', 'landing_page']

此外,我们可以利用has_option()方法来检查给定部分是否包含某个选项:

# Previous code in parser_playground.py

print(f'"admin_page" in "admin" section: {config.has_option("admin", "admin_page")}')

要访问模块的值,可以使用解析器的get()方法并提供区域名称和选项名称。这些值将始终为字符串(如果存在)。如果需要其他格式的文件,请考虑使用相应的getboolean(),getint()和getfloat()方法。他们将尝试将字符串解析为所需的数据类型。

总结本节内容时有个概念需要提到,它就是映射协议访问。这个通用名称意味着可以像处理字典一样访问值。也就是说,我们可以使用config [“ section”] [“ option”]类似的方法来访问某个值,甚至检查某个模块中是否存在某个选项:

# Previous code in parser_playground.py

print("admin_page" in config["admin"]) # True

print(config["admin"]["admin_page"]) # yes

如何修改信息

接下来,让我们看一下如何添加或更改信息并将其写回到配置文件中。同样,我们从模块开始。要添加一个模块,我们可以使用ConfigParser的add_section()方法。它接受模块名称作为字符串,并将相应模块添加到解析器。提供不同的数据类型会导致TypeError。如果该模块已经存在,则会引发DuplicateSectionError。尝试将该模块命名为默认值会导致ValueError。

# Previous code in parser_playground.py

config.add_section("unknown")

print(f'Sections: {config.sections()}') # Sections: ['moderator', 'admin', 'unknown']

要删除一个模块,只需使用remove_section()方法。

# Previous code in parser_playground.py

config.remove_section("unknown")

print(f'Sections: {config.sections()}') # Sections: ['moderator', 'admin']

Python的ConfigParser对象提供了类似的操作选项的方法。例如,调用set()方法,不仅可以向模块添加新选项,还可以更新现有选项。同样,如果您想完全删除某个选项,请使用解析器的remove_option()方法。

# Previous code in parser_playground.py

config.set("admin", "admin_page", "false")

config.remove_option("admin", "moderator_page")

print(f'Options in "admin" section: {config.items("admin")}')

处理完配置后,我们可以将其写回到相同或不同的文件,如下所示:

# Previous code in parser_playground.py

with open("config1.ini", "w") as f:

config.write(f)

插值

最后但也很重要的一点,让我们看一下使ConfigParser优于Python的json模块的东西:插值。插值意味着可以在调用某些get()方法返回值之前对其进行预处理。configparser模块提供两个插值类:BasicInterpolation和ExtendedInterpolation。第一个只允许重用配置文件中同一模块中的选项,并且其语句不如后一个类的语句漂亮。这就是为什么我们只用ExtendedInterpolation类。

以下代码段显示了使用Extended Interpolation语句的配置文件。

# interpolation_config.ini

[paths]

root_dir = /home/florian

downloads_dir = ${root_dir}/Downloads

[destinations]

app_dir = ${paths:downloads_dir}/application/python

本质上,第一个模块定义了根目录的路径。该路径用作第二个选项的前缀,即下载目录的路径。在第二个模块中,我们有一个选项app_dir,它重用了pahts模块中对downloads目录的定义。

为了掌握这一点,我们在实例化解析器时让ConfigParser使用ExtendedInterpolation作为插值类型:

# interpolation.py

from configparser import ConfigParser

from configparser import ExtendedInterpolation

config = ConfigParser(interpolation=ExtendedInterpolation())

config.read("interpolation_config.ini")

如果现在打印destinations模块的app_dir选项的值,则会得到一个插值字符串。

# Previous code in interpolation.py

print(config.get("destinations", "app_dir"))

$ python interpolation.py

/home/florian/Downloads/application/python

概要

本文不仅学习了如何使用初始化文件结构访问文件中的值,还学习了如何操作和扩展它们。此外,您还了解了configparser的插值功能以及如何根据需要使用它们。

python内置模块在哪个文件夹_用 Python 内置模块处理 ini 配置文件相关推荐

  1. python如何创建一个文件夹_利用Python怎么创建一个文件夹

    利用Python怎么创建一个文件夹 发布时间:2020-12-08 14:48:04 来源:亿速云 阅读:91 作者:Leah 这期内容当中小编将会给大家带来有关利用Python怎么创建一个文件夹,文 ...

  2. python fabric上传文件夹_通过python的fabric包完成代码上传部署(简单版)

    首先是安装fabric包pip install fabric fabric常用参数 -l : 显示定义好的任务函数名 -f : 指定fab入口文件,默认入口文件名为fabfile.py -H : 指定 ...

  3. python如何生成excel文件夹_用python脚本通过excel生成文件夹树结构

    大概这样写标题是对的吧... 目标: 通过excel目录结构文档生成文件夹树结构. 也就是: 通过下面的excel 生成下面的文档树结构: 方法: 1.分析:一般文档结构都是事先构思好.可以在txt文 ...

  4. python怎么保存excel文件夹_在Python中保存excel工作簿

    我是Python新手,我需要打开文件夹中的所有excel(一个接一个),等待SAS addin加载新数据,然后保存并关闭它.我试着使用一些库,但无法获得预期的结果.在 使用子流程:import os ...

  5. python读取多个文件夹_在python中如何从不同的文件夹读取多个文件

    我在不同的文件夹中有年度数据文件.每个文件包含从1月1日到12月31日的每日数据.数据文件名类似于AS060419.67,其中最后四位代表年份,即1967年,0604是文件夹名.在 我试图使用下面的代 ...

  6. python打开鼠标指定文件夹_学会python文件操作,鼠标好像没用了,学习python第10天...

    电影是人类对未来的向往,在<黑客帝国>中,我们看到了一个数字化的社会,而当你学会python文件操作,你也就离你向往的黑客近一点了,用程序来直接影响电脑上的其他文件,只需要几行代码就搞定. ...

  7. python找不到scripts文件夹_安装python时没有scripts文件夹如何处理

    这次给大家带来安装python时没有scripts文件夹如何处理,处理安装python时没有scripts文件夹的注意事项有哪些,下面就是实战案例,一起来看一下. 安装Python2.7,好多次都不会 ...

  8. linux 查找文件夹_用python打造一个基于socket的文件(夹)传输系统

    这段时间在学习python,接触到了网络编程中的socket这块,加上自己在用的Linux服务器都是原生支持python的,于是乎有了个做文件传输功能程序的想法. 毕竟python语言中,有下载功能的 ...

  9. 如何用python新建文件夹_用Python编写一个每天都在系统下新建一个文件夹的脚本...

    这个程序的功能非常的简单,就是每天在系统中新建一个文件夹.文件夹即当前的时间.此代码是在同事那边看到的,为了锻炼下自己薄弱的Python能力,所以花时间重新写了一个.具体代码如下: import ti ...

最新文章

  1. iOS基础问答面试题连载-附答案
  2. 简单工厂模式(详细)(举例饮料)
  3. java 中IO流的概念
  4. 谷歌已推送 Android Q Beta 1
  5. spring学习(37):注入list类型
  6. 虹软sdk 服务器运行 错误码94212 解决方案
  7. 释放内容化势能 聚划算《划算8点档》给出新思路
  8. leetcode 859 亲密字符串
  9. mac 安装 mongo 及基本命令
  10. ZOJ-3103 Cliff Climbing 最短路
  11. 什么是多线程,锁,死锁,怎么避免死锁(转)
  12. MSN无法登陆错误汇总
  13. wps里的超链接PDF打不开_PDF转Word都可以怎样操作?
  14. html如何设置按钮背景为透明,css 设置按钮(背景色渐变、背景色透明)
  15. 两大主流存储架构介绍:软件定义存储与超融合
  16. 【机器学习7】决策树
  17. C语言数字图像处理---3.3图像锐化
  18. Linux红帽8.2系统中引导过程及引导修复
  19. 不良事件总结怎么写_一份年度护理不良事件报告是怎样写成的
  20. 在线教育大数据营销平台实战(搭建篇)

热门文章

  1. 怎么把苹果手机通讯录导入华为手机_苹果手机资料快速导入华为手机。苹果的ios系统也可以把资料导入安卓!...
  2. 关于groupby与层次化索引的联系和层次化标签的使用
  3. SQLite剖析之事务处理技术
  4. 不让EditText打开就获取焦点
  5. 中国中产阶层占全球三成 财富增长动力来自房产
  6. pytorch 向量转化为one-hot编码
  7. pthread_join pthread_exit 线程 Linux函数 线程退出 线程等待
  8. openssl生成Windows证书
  9. Linux glib命令行解析GOptionEntry使用
  10. SurfaceFlinger中queueBuffer与dequeueBuffer作用(十二)