Python中的常见配置文件写法
在软件开发过程中,开发者常常需要利用一些固定的参数或常量。对于这些相对恒定且频繁使用的元素,一种常见的做法是将它们集中存储在一个特定的文件中,以避免在多个模块代码中重复定义,从而维护核心代码的清晰度和整洁性。
具体而言,我们可以将这些固定元素编写成一个Python文件,例如命名为settings.py或config.py。这种做法的优势在于,它允许在同一项目内部通过import语句直接引用该文件中的配置项。然而,当需要在非Python平台上共享这些配置信息时,仅依赖.py文件作为配置存储方式则显得不够灵活。在此情境下,选择一种更为通用的配置文件格式显得尤为重要。
目前,市场上存在多种广泛使用和流行的配置文件格式,主要包括ini、json、toml、yaml以及xml等。这些配置文件类型均支持通过标准库或第三方库进行解析,从而在不同的编程环境和平台上实现配置信息的共享与利用。
ini
ini 即 Initialize 初始化之意,早期是在 Windows 上配置文件的存储格式。ini 文件的写法通俗易懂,往往比较简单,通常由节(Section)、键(key)和值(value)组成,就像以下形式:
[localdb]
host = 127.0.0.1
user = root
password = 123456
port = 3306
database = mysql
Python 本身内置的 configparser 标准库,我们直接就可以用来对 ini 文件进行解析。如我们将上述内容保存在一个名为 db.ini 的文件中,然后使用 read() 方法来进行解析和读取,最后通过 items() 方法来获取指定节点下的所有键值对。
>>> from configparser import ConfigParser
>>> cfg = ConfigParser()
>>> cfg.read("/Users/Bobot/db.ini")
['/Users/Bobot/db.ini']
>>> cfg.items("localdb")
[('host', '127.0.0.1'), ('user', 'root'), ('password', '123456'), ('port', '3306'), ('database', 'mysql')]
需要注意的是,configparser 默认将值以字符串的形式呈现,所以这也就是为什么我们在 db.ini 文件中没有加引号而是直接将字面量写在上面的原因。
获取到键值对后,我其实直接就将其转换成字典,然后通过解包的方式进行穿参,保持代码简洁:
#!pip install pymysql
import pymysql
from configparser import ConfigParsercfg = ConfigParser()
cfg.read("/Users/Bobot/db.ini")
db_cfg = dict(cfg.items("localdb"))con = pymysql.connect(**db_cfg)
json
json 格式可以说是我们常见的一种文件形式了,也是目前在互联网较为流行的一种数据交换格式。除此之外,json 有时也是配置文件的一种。
比如 npm(JavaScript 包管理工具类似 Python 的 pip)、以及微软出品的目前被广泛使用的 VSCode 编辑器,都使用 json 编写配置参数。
和 configparser 一样,Python 也内置了 json 标准库,可以通过 load() 和 loads() 方法来导入文件式和字符串的 json 内容。
{"localdb":{"host": "127.0.0.1","user": "root","password": "123456","port": 3306,"database": "mysql"}
}
我们将上述内容保存为 db.json 后进行读取和解析,json 库读取 json 文件相对简单容易,而且很容易解析成 Python 的字典对象。
>>> import json
>>> from pprint import pprint
>>>
>>> with open('/Users/Bobot/db.json') as j:
... cfg = json.load(j)['localdb']
...
>>> pprint(cfg)
{'database': 'mysql','host': '127.0.0.1','password': '123456','port': 3306,'user': 'root'}
使用 json 文件配置的缺点就是语法标准严格限制,为人所诟病之一的就是无法在当中写注释,除非采取 json 类型的其他超集作为替代方案(VSCode 中能写注释的 json 参数配置文件便是代替方案的一种);同时存在嵌套过深的问题,容易导致出错,不宜用来写过长或复杂的参数配置信息。
toml
toml 格式(或 tml 格式)是 Github 联合创始人 Tom Preston-Werner 所提出的一种配置文件格式。根据维基百科的资料,toml 最开始提出时是在 2013年7月份,距今已有七年时间;它在某些方面也与后面要谈到的 yaml 文件有些类似,但如果当你知道 yaml 的规范有几十页(没有错,真的就是几十页……)的时候,可能你真的就不太愿意去写那么复杂的配置文件,toml 格式则倒是个不错的选择。
toml 格式大致如下:

从这里可以看出 toml 有点类似于前面所讲的 ini 文件。但是它比 ini 扩展了更多的内容。
在样例图片中我们可以看到,除了基本的字符串以外,例如时间戳、布尔值、数组等都进一步支持,而且样式和 Python 的原生写法十分类似。
当然这里不会过多介绍 toml 格式的一些规范说明,有人已经对官方的规范文档进行了翻译,有兴趣的朋友可以直接查阅。
这么契合 Python 方式的配置文件类型已经有开发者造出了相应的「轮子」,目前在 Github 上 Stars 数最多的是则是 uiri/toml 的版本,不过该版本仅通过了 v0.5 版本 toml 规范,但在使用上还是蛮简洁的,我们可以通过 pip 命令进行安装
pip install toml
该库的解析方式很简单,也有点类似于 json 库的解析用法,即通过load() 或 loads() 来进行解析;同理转换并导出也是同样类似的用法。
比如我们现在将以下内容写入到 config.toml 中:
[mysql]
host = "127.0.0.1"
user = "root"
port = 3306
database = "test"[mysql.parameters]pool_size = 5charset = "utf8"[mysql.fields]pandas_cols = [ "id", "name", "age", "date"]
紧接着我们就可以通过 toml 库中的 load() 方法来进行读取:
>>> import toml
>>> import os
>>> from pprint import pprint
>>> cfg = toml.load(os.path.expanduser("~/Desktop/config.toml"))
>>> pprint(cfg)
{'mysql': {'database': 'test','fields': {'pandas_cols': ['id', 'name', 'age', 'date']},'host': '127.0.0.1','parameters': {'charset': 'utf8', 'pool_size': 5},'port': 3306,'user': 'root'}}
可以看到 toml 文件被间接地转化成了字典类型,当然这也就是 json 版的写法(将单引号替换成双引号即可),方便我们后续调用或者传参。
yaml
yaml 格式(或 yml 格式)是目前较为流行的一种配置文件,它早在 2001 由一个名为 Clark Evans 的人提出;同时它也是目前被广泛使用的配置文件类型,典型的就是 Docker 容器里的 docker-compose.yml 配置文件,如果经常使用 Docker 进行部署的人对此不会陌生。
yaml 文件的设计从 Python、XML 等地方获取灵感,所以在使用时能很清楚地看到这些部分的影子。
在上一节 toml 内容里我曾提到,yaml 的规范内容可以说是冗长和复杂,足足有80页之多。

感兴趣的朋友可以再自行了解相关用法。
YAML 官方早已经提供了相应的 Python 库进行支持,即 PyYAML;当然也同样需要我们事先进行安装:
pip install pyyaml
同 json 库和 toml 库一样,通过 load() 方法来进行加载。
需要注意的是,使用 load() 方法会存在一定的安全隐患,从思科 Talos 的这份报告中我们可以看到,如果加载了未知或不信任的 yaml 文件,那么有可能会存在被攻击的风险和网络安全隐患,因为它能够直接调用相应的 Python 函数来执行为攻击者所需要的命令,比如说在 yaml 文件中写入这么一段:
# 使用Linux和macOS的朋友不要轻易尝试
!!python/object/apply:os.system ["rm -rf /"]
因此最好是使用 safe_load() 来代替 load() 方法。
这和 Python 内置的 string 标准库中 Template 类的 substitute() 模板方法一样存在着同样的安全隐患,所以使用 safe_substitute() 来替代是一样的道理。
如我们现在将之前的一些配置信息写入 config.yaml 文件中:
mysql:host: "127.0.0.1"port: 3306user: "root"password: "123456"database: "test"parameter:pool_size: 5charset: "utf8"fields:pandas_cols: - id- name- age- date
然后我们通过 safe_load() 方法进行解析:
>>> import os
>>> from pprint import pprint
>>>
>>> with open(os.path.expanduser("~/config.yaml"), "r") as config:
... cfg = yaml.safe_load(config)
...
>>> pprint(cfg)
{'mysql': {'database': 'test','fields': {'pandas_cols': ['id', 'name', 'age', 'date']},'host': '127.0.0.1','parameter': {'charset': 'utf8', 'pool_size': 5},'password': '123456','port': 3306,'user': 'root'}}
可以看到最后结果和前面的 toml 库的解析结果基本一致。
结语
以上综述了若干主流且普遍采用的配置文件类型及其对应的Python读取方法。然而,部分读者或许已注意到,其中并未涵盖XML格式的配置文件。尽管XML配置文件在Java系编程语言环境中更为常见,但其可读性往往令人望而却步。对于不熟悉XML文件的读者而言,一个直观的理解方式是,通过Chrome浏览器访问任意网站,随后按F12键进入开发者工具,观察其中繁复的HTML元素,这些元素在某种程度上可视作XML文件的缩影。
除了上述主流配置文件类型之外,还存在如.cfg、.properties等格式的文件,它们同样可作为配置文件使用。甚至如前文所述,单独采用一个.py文件来编写各类配置信息,并以此作为配置文件进行导入,亦无不可。然而,在跨语言共享配置信息时,此类方法可能会面临一定的障碍。鉴于篇幅限制及主题聚焦,本文对此类非主流配置文件类型不做过多阐述。对于对此类内容感兴趣的读者,建议进一步自行深入研究。

相关文章:
Python中的常见配置文件写法
在软件开发过程中,开发者常常需要利用一些固定的参数或常量。对于这些相对恒定且频繁使用的元素,一种常见的做法是将它们集中存储在一个特定的文件中,以避免在多个模块代码中重复定义,从而维护核心代码的清晰度和整洁性。 具体而…...
语义分割实战——基于PSPnet神经网络动物马分割系统源码
第一步:准备数据 动物马分割数据,总共有328张图片,里面的像素值为0和1,所以看起来全部是黑的,不影响使用 第二步:搭建模型 psp模块的样式如下,其psp的核心重点是采用了步长不同,po…...
Python+Appium编写脚本
一、环境配置 1、安装JDK,版本1.8以上 2、安装Python,版本3.x以上,用来解释python 3、安装node.js,版本^14.17.0 || ^16.13.0 || >18.0.0,用来安装Appimu Server 4、安装npm,版本>8,用…...
RK3288 android7.1 适配 ilitek i2c接口TP
一,Ilitek 触摸屏简介 Ilitek 提供多种型号的触控屏控制器,如 ILI6480、ILI9341 等,采用 I2C 接口。 这些控制器能够支持多点触控,并具有优秀的灵敏度和响应速度。 Ilitek 的触摸屏控制器监测屏幕上的触摸事件。 当触摸发生时&am…...
C++ 越来越像函数式编程了!
C 越来越像函数式编程了 大家好,欢迎来到今天的博客话题。今天我们要聊的是 C 这门老牌的强类型语言是如何一步一步向函数式编程靠拢的。从最早的函数指针,到函数对象(Functor),再到 std::function 和 std::bind&…...
maven工程结构说明
1、maven工程文件目录 |-- pom.xml # Maven 项目管理文件 |-- src # 放项目源文件|-- main # 项目主要代码| |-- java # Java 源代码目录| | -- com/example/myapp…...
【GESP】C++一级真题练习(202312)luogu-B3921,小杨的考试
GESP一级真题练习。为2023年12月一级认证真题。逻辑计算问题。 题目题解详见:【GESP】C一级真题练习(202312)luogu-B3921,小杨的考试 | OneCoder 【GESP】C一级真题练习(202312)luogu-B3921,小杨的考试 | OneCoderGESP一级真题练习。为2023…...
游戏中Dubbo类的RPC设计时的注意要点
一.消费方 1.需要使用到动态代理,代理指定的接口,这样子接口被调用时,就可以拿到:"类名 方法名参数返回值" 这些类型。 2.既然是rpc,那么接口被调用时,肯定在动态代理中会进行网络消息的发送&a…...
ARXML汽车可扩展标记性语言规范讲解
ARXML: Automotive Extensible Markup Language (汽车可扩展标记语言) xmlns: Xml name space (xml 命名空间) xsd: Xml Schema Definition (xml 架构定义) 1、XML与HTML的区别,可扩展。 可扩展,主要是…...
Hadoop(HDFS)
Hadoop是一个开源的分布式系统架构,旨在解决海量数据的存储和计算问题,Hadoop的核心组件包括Hadoop分布式文件系统(HDFS)、MapReduce编程模型和YARN资源管理器,最近需求需要用到HDFS和YARN。 文章目录 HDFS优缺点HDFS的读写原理 常…...
机器学习系列----梯度下降算法
梯度下降算法(Gradient Descent)是机器学习和深度学习中最常用的优化算法之一。无论是在训练神经网络、线性回归模型,还是其他类型的机器学习模型时,梯度下降都是不可或缺的一部分。它的核心目标是最小化一个损失函数(…...
AI大模型:软件开发的未来之路
随着AI技术的快速发展,AI大模型正在对软件开发流程产生深远的影响。从代码自动生成到智能测试,AI大模型正在重塑软件开发的各个环节,为软件开发者、企业和整个产业链带来新的流程和模式变化。 首先,AI大模型的定义是指通过大规模…...
指标+AI+BI:构建数据分析新范式丨2024袋鼠云秋季发布会回顾
10月30日,袋鼠云成功举办了以“AI驱动,数智未来”为主题的2024年秋季发布会。大会深度探讨了如何凭借 AI 实现新的飞跃,重塑企业的经营管理方式,加速数智化进程。 作为大会的重要环节之一,袋鼠云数栈产品经理潮汐带来了…...
2024年第四届“网鼎杯”网络安全比赛---朱雀组Crypto- WriteUp
2024年第四届“网鼎杯”网络安全比赛---朱雀组Crypto-WriteUp Crypto:Crypto-2:Crypto-3: 前言:本次比赛已经结束,用于赛后复现,欢迎大家交流学习! Crypto: Crypto-2: …...
关于Markdown的一点疑问,为什么很多人说markdown比word好用?
markdown和word压根不是一类工具,不存在谁比谁好,只是应用场景不一样。 你写博客、写readme肯定得markdown,但写合同、写简历肯定word更合适。 markdown和word类似邮箱和微信的关系,这两者都可以通信,但微信因为功能…...
NoSQL大数据存储技术测试(1)绪论
写在前面:未完成测试的同学,请先完成测试,此博文供大家复习使用,(我的答案)均为正确答案,大家可以放心复习 单项选择题 第1题 以下不属于云计算部署模型的是( ) 公…...
Linux命令学习,git命令
Linux系统,Git是一个强大的版本管理系统,允许用户跟踪代码的更改、管理项目历史以及与他人协作。 Linux Git命令: 初始化仓库:当前目录创建一个Git仓库,生成.git隐藏目录存储版本历史和其他Git相关的元数据。 git init 克隆仓库…...
【AI大模型】Transformer中的编码器详解,小白必看!!
前言 Transformer中编码器的构造和运行位置如下图所示,其中编码器内部包含多层,对应下图encoder1…encoder N,每个层内部又包含多个子层:多头自注意力层、前馈神经网络层、归一化层,而最关键的是多头自注意力层。 自注…...
PostgreSQL 字段按逗号分隔成多条数据的技巧与实践 ️
全文目录: 开篇语前言 📚1. PostgreSQL 字段拆分的基本概念 🎯2. 使用 string_to_array 函数拆分字段 💬示例:使用 string_to_array 拆分字段结果: 3. 使用 unnest 和 string_to_array 结合拆分 ǵ…...
设计模式学习总结(一)
设计模式学习笔记 面向对象、设计原则、设计模式、编程规范、重构之间的关系 面向对象、设计原则、设计模式、编程规范、重构之间的关系 面向对象 现在,主流的编程范式或者是编程风格有三种:面向过程、面向对象和函数式编程。 需要掌握七大知识点&#…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
