热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用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。如果该模块已经存在,则会引发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 

推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
author-avatar
恋苦尘雪77
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有