python内置模块在哪个文件夹_用 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
概要
本文不仅学习了如何使用初始化文件结构访问文件中的值,还学习了如何操作和扩展它们。此外,您还了解了configparser的插值功能以及如何根据需要使用它们。
python内置模块在哪个文件夹_用 Python 内置模块处理 ini 配置文件相关推荐
- python如何创建一个文件夹_利用Python怎么创建一个文件夹
利用Python怎么创建一个文件夹 发布时间:2020-12-08 14:48:04 来源:亿速云 阅读:91 作者:Leah 这期内容当中小编将会给大家带来有关利用Python怎么创建一个文件夹,文 ...
- python fabric上传文件夹_通过python的fabric包完成代码上传部署(简单版)
首先是安装fabric包pip install fabric fabric常用参数 -l : 显示定义好的任务函数名 -f : 指定fab入口文件,默认入口文件名为fabfile.py -H : 指定 ...
- python如何生成excel文件夹_用python脚本通过excel生成文件夹树结构
大概这样写标题是对的吧... 目标: 通过excel目录结构文档生成文件夹树结构. 也就是: 通过下面的excel 生成下面的文档树结构: 方法: 1.分析:一般文档结构都是事先构思好.可以在txt文 ...
- python怎么保存excel文件夹_在Python中保存excel工作簿
我是Python新手,我需要打开文件夹中的所有excel(一个接一个),等待SAS addin加载新数据,然后保存并关闭它.我试着使用一些库,但无法获得预期的结果.在 使用子流程:import os ...
- python读取多个文件夹_在python中如何从不同的文件夹读取多个文件
我在不同的文件夹中有年度数据文件.每个文件包含从1月1日到12月31日的每日数据.数据文件名类似于AS060419.67,其中最后四位代表年份,即1967年,0604是文件夹名.在 我试图使用下面的代 ...
- python打开鼠标指定文件夹_学会python文件操作,鼠标好像没用了,学习python第10天...
电影是人类对未来的向往,在<黑客帝国>中,我们看到了一个数字化的社会,而当你学会python文件操作,你也就离你向往的黑客近一点了,用程序来直接影响电脑上的其他文件,只需要几行代码就搞定. ...
- python找不到scripts文件夹_安装python时没有scripts文件夹如何处理
这次给大家带来安装python时没有scripts文件夹如何处理,处理安装python时没有scripts文件夹的注意事项有哪些,下面就是实战案例,一起来看一下. 安装Python2.7,好多次都不会 ...
- linux 查找文件夹_用python打造一个基于socket的文件(夹)传输系统
这段时间在学习python,接触到了网络编程中的socket这块,加上自己在用的Linux服务器都是原生支持python的,于是乎有了个做文件传输功能程序的想法. 毕竟python语言中,有下载功能的 ...
- 如何用python新建文件夹_用Python编写一个每天都在系统下新建一个文件夹的脚本...
这个程序的功能非常的简单,就是每天在系统中新建一个文件夹.文件夹即当前的时间.此代码是在同事那边看到的,为了锻炼下自己薄弱的Python能力,所以花时间重新写了一个.具体代码如下: import ti ...
最新文章
- iOS基础问答面试题连载-附答案
- 简单工厂模式(详细)(举例饮料)
- java 中IO流的概念
- 谷歌已推送 Android Q Beta 1
- spring学习(37):注入list类型
- 虹软sdk 服务器运行 错误码94212 解决方案
- 释放内容化势能 聚划算《划算8点档》给出新思路
- leetcode 859 亲密字符串
- mac 安装 mongo 及基本命令
- ZOJ-3103 Cliff Climbing 最短路
- 什么是多线程,锁,死锁,怎么避免死锁(转)
- MSN无法登陆错误汇总
- wps里的超链接PDF打不开_PDF转Word都可以怎样操作?
- html如何设置按钮背景为透明,css 设置按钮(背景色渐变、背景色透明)
- 两大主流存储架构介绍:软件定义存储与超融合
- 【机器学习7】决策树
- C语言数字图像处理---3.3图像锐化
- Linux红帽8.2系统中引导过程及引导修复
- 不良事件总结怎么写_一份年度护理不良事件报告是怎样写成的
- 在线教育大数据营销平台实战(搭建篇)
热门文章
- 怎么把苹果手机通讯录导入华为手机_苹果手机资料快速导入华为手机。苹果的ios系统也可以把资料导入安卓!...
- 关于groupby与层次化索引的联系和层次化标签的使用
- SQLite剖析之事务处理技术
- 不让EditText打开就获取焦点
- 中国中产阶层占全球三成 财富增长动力来自房产
- pytorch 向量转化为one-hot编码
- pthread_join pthread_exit 线程 Linux函数 线程退出 线程等待
- openssl生成Windows证书
- Linux glib命令行解析GOptionEntry使用
- SurfaceFlinger中queueBuffer与dequeueBuffer作用(十二)