原标题:用Python内置模块处理ini配置文件

简介

开发人员每天都在处理一些大型而复杂的项目, 而配置文件会帮到我们并节省不少时间。在处理配置文件过程中,无需更改源代码本身,只需要调整配置文件即可访问不同的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。如果该模块已经存在,则会引发DuplicateSecti。尝试将该模块命名为默认值会导致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

python config模块_用Python内置模块处理ini配置文件相关推荐

  1. python 异常处理模块_扩展Python模块系列(五)----异常和错误处理

    在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_ ...

  2. python画图模块_学习python画图模块plotnine:第一步安装

    官网链接 https://plotnine.readthedocs.io/en/stable/index.html 知乎介绍的文章 https://zhuanlan.zhihu.com/p/47814 ...

  3. python秒表模块_利用python的kivy模块做一个秒表

    Kiy是一个开源的Python模块库,用于开发界面应用程序和其它采用自然用户界面的多点触控应用软件.它可以在Android,iOS,Linux,OS X和Windows执行,是一款有趣跨平台的模块库. ...

  4. python没有模块_关于python如果没有numpy模块如何处理

    1.在python中,你在python的shell输入>>>import numpy 但是编译器告诉你没有numpy库,这时候你就要导入python库,那么如何导入呢 2.收下访问h ...

  5. python shelve模块_说说 Python 的 shelve 模块

    利用 Python 的 shelve 模块, 可以将程序中需要保存的数据,以二进制放入 shelf 文件中.另一个程序就可以读取 shelf 文件,用于业务逻辑.也就是说 shelve 模块可以实现数 ...

  6. python svn模块_使用Python实现一键批量更新SVN/Git模块的脚本

    现在我们开发的过程中,大都是模块化的工作方式,咱们的工程源码结构就是N个模块,N个SVN/Git地址,如果需要更新就得手动一个个的操作,弄起来实在太麻烦了,之前我都是写批处理来实现批量更新的,现在来使 ...

  7. python性能测试模块_技巧python模块性能测试-阿里云开发者社区

    算法是程序的灵魂,优秀的算法能给程序的效率带来极大的提升,而算法的优劣,往往要经过大量的测试. 在硬件环境基本不变的前提下,对算法实验的次数越多,测试算法运行效率的结果也就越接近真实值. python ...

  8. python thread模块_【Python@Thread】thread模块

    一.关于Python多线程 Python解释器中可以同时运行多个线程,但是再任意时刻只能有一个线程在解释器运行. Python虚拟机的访问是由全局解锁器(GIL)控制的,由GIL保证同时只有一个线程的 ...

  9. python pdb模块_使用Python中PDB模块中的命令来调试Python代码的教

    你有多少次陷入不得不更改别人代码的境地?如果你是一个开发团队的一员,那么你遇到上述境地的次数比你想要的还要多.然而,Python中有一个整洁的调试特性(像其他大多数语言一样),在这种情况下使用非常方便 ...

最新文章

  1. php入门时间,PHP入门(8)日期和时间
  2. 山西省职高计算机分数线,2020年山西五年制高职和普通中专录取分数线
  3. mysql开启慢查询
  4. 手机访问网站自动跳转到手机版
  5. jquery常见获取高度
  6. 强大的APIClound云修复——告别繁琐的编译打包流程
  7. Qt文档阅读笔记-Label QML Type官方解析及实例
  8. 高通骁龙855刚捂热 骁龙865就现身:三星代工 7nm EUV制程
  9. oracle rac openstack,利用 Chef 实现 OpenStack 块存储多节点的自动化部署
  10. byteofpython中文gitbook_GitBook 简明教程
  11. Process Hacker 简单介绍
  12. java模拟国际象棋游戏_Javafx实现国际象棋游戏
  13. Python 棋子移动游戏
  14. 服务器信息怎么备份,DNS服务器信息备份与还原教程
  15. am335x UART1输入u-boot 调试信息代码修改
  16. libjpeg库使用简介
  17. 国外名校在线学位申请
  18. 微信视频号如何直播游戏效果最好?教你最简单的方法
  19. 微信支付回调通知实现
  20. NEWPLAN-博客目录

热门文章

  1. Storing CGPoint, CGSize and CGRect in Collections with NSValue
  2. C++ 模板实例化与调用
  3. Linux网络端口命名规则,一致性网络设备命名
  4. Spring Boot (30) 上传文件
  5. 我的第一个Python随笔
  6. Knockoutjs之observable和applyBindings的使用
  7. Linux查看内存,负载状态
  8. 数据结构 【实验 串的基本操作】
  9. jQuery插件之:对话框
  10. Java线程池ThreadPoolExecutor源码分析