配置文件这么多格式,Python到底该怎么选?一文带你梳理七种用法
itomcoil 2025-09-23 20:41 6 浏览
在写 Python 项目的时候,最让人头大的环节之一,就是配置文件。
你肯定遇到过:
- 模型训练路径要配置;
- API Key 要配置;
- 数据库连接参数要配置;
- 生产环境、测试环境的参数还得区分……
结果就是:项目写着写着,光是管理配置文件就快把人逼疯。
更扎心的是,不同的项目,配置文件格式还五花八门——有人用 .ini,有人用 .json,有人推崇 .yaml,还有 .toml、.env、.xml,甚至直接用 .py 文件来写。
那么问题来了:到底该用哪种?它们有什么区别?在 Python 里怎么读写?
别急,这篇文章我会把 7 种常见的配置方式一次性说清楚,代码实战全给你备好,照着用就行。
一、为什么配置文件这么重要?
在项目开发里,配置文件就像“遥控器”。 你不可能把所有参数写死在代码里吧? 那样一旦换服务器、换数据库、换模型路径,改动起来简直要命。
有了配置文件,就像把遥控器交给你:
- 想改参数,直接改配置,不用动核心代码;
- 想区分测试环境和生产环境?复制两份配置文件就行;
- 想分享项目?把敏感信息放进 .env,别人拿到项目后只要改一改配置,就能跑起来。
所以,配置文件的格式选择,其实决定了你的项目可维护性和扩展性。
二、常见配置格式横向对比
咱们先来个总览,心里有数:
格式 | 可读性 | 复杂度 | 安全性 | 类型支持 | 适用场景 |
INI | 高 | 低 | 高 | 基础类型 | 简单分组配置 |
JSON | 中 | 中 | 高 | 丰富 | 跨语言、数据交换 |
YAML | 高 | 高 | 中 | 丰富 | 复杂配置,带注释 |
XML | 低 | 高 | 高 | 丰富 | 企业级规范 |
.env | 高 | 低 | 高 | 字符串 | 环境变量、敏感信息 |
TOML | 高 | 中 | 高 | 丰富 | Python 项目常用 |
Python 文件 | 中 | 高 | 低 | 完全支持 | 框架级、动态配置 |
一张表看下来,基本思路就出来了:
- 简单粗暴用 INI;
- 要跨语言、交换数据用 JSON;
- 想要人类友好 + 注释能力强,就上 YAML;
- 如果你是企业项目、偏 Java 系,可能用 XML;
- 需要管理敏感信息,.env 几乎是标配;
- TOML 是 Python 项目的新宠,兼顾简洁和结构;
- 框架配置动不动就是 .py 文件(比如 Django),那是特殊情况。
下面我们就一一拆解,看它们在 Python 里怎么用。
三、七种方式逐个过
1. INI 文件 —— 老牌选手
INI 文件最大的优点就是:简单、直观、Python 原生支持。 标准库里有 configparser,拿来就用。
import configparser
def handle_ini_file():
# 写INI文件
config = configparser.ConfigParser()
config['DEFAULT'] = {
'ServerAliveInterval': '45',
'Compression': 'yes',
'CompressionLevel': '9'
}
config['bitbucket.org'] = {}
config['bitbucket.org']['User'] = 'hg'
config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com']
topsecret['Port'] = '50022'
topsecret['ForwardX11'] = 'no'
# 写入文件
with open('myconfig.ini', 'w') as f:
config.write(f)
# 读取INI文件
config_read = configparser.ConfigParser()
config_read.read('myconfig.ini')
print("INI文件内容:")
print(f"ServerAliveInterval: {config_read['DEFAULT']['ServerAliveInterval']}")
print(f"bitbucket User: {config_read.get('bitbucket.org', 'User')}")
print(f"Port: {config_read.getint('topsecret.server.com', 'Port')}")
print(f"ForwardX11: {config_read.getboolean('topsecret.server.com', 'ForwardX11')}")
适合场景:配置比较简单,不需要嵌套。
2. JSON 文件 —— 跨语言通吃
几乎所有语言都支持 JSON,这就是它的杀手锏。 Python 里用 json 模块,一行搞定。
import json
def handle_json_file():
data = {
"name": "John",
"age": 30,
"city": "New York",
"is_student": False,
"hobbies": ["reading", "gaming", "hiking"],
"address": {
"street": "123 Main St",
"zipcode": "10001"
}
}
# 写JSON
with open('myconfig.json', 'w') as f:
json.dump(data, f, indent=4)
# 读JSON
with open('myconfig.json', 'r') as f:
data_read = json.load(f)
print("JSON文件内容:")
print(f"Name: {data_read['name']}")
print(f"Age: {data_read['age']}")
print(f"Hobbies: {', '.join(data_read['hobbies'])}")
print(f"Zipcode: {data_read['address']['zipcode']}")
适合场景:需要和别的语言/程序交互的数据交换。
3. YAML 文件 —— 人类最友好的配置
YAML 近几年在 Python 圈特别火,优点就是:简洁,还能写注释! 不过要装 pyyaml,标准库没带。
import yaml
def handle_yaml_file():
data = {
"name": "Alice",
"age": 25,
"city": "London",
"is_student": True,
"hobbies": ["painting", "dancing"],
"address": {
"street": "456 Oak Ave",
"zipcode": "SW1A 1AA"
}
}
# 写YAML
with open('myconfig.yaml', 'w') as f:
yaml.dump(data, f, sort_keys=False)
# 读YAML
with open('myconfig.yaml', 'r') as f:
data_read = yaml.safe_load(f)
print("YAML文件内容:")
print(f"Name: {data_read['name']}")
print(f"Age: {data_read['age']}")
print(f"Hobbies: {', '.join(data_read['hobbies'])}")
print(f"Zipcode: {data_read['address']['zipcode']}")
适合场景:复杂项目,需要手动编辑、加注释。
4. TOML 文件 —— Python 官方推荐
TOML 是近年来火起来的,它的设计初衷就是做配置。 Python 官方文档里推荐用它。
import toml
# 写入TOML
data = {
"title": "TOML config",
"owner": {
"name": "Tom Preston-Werner",
"dob": "1979-05-27T07:32:00-08:00"
},
"database": {
"server": "192.168.1.1",
"ports": [8001, 8001, 8002]
}
}
with open("config.toml", "w") as f:
toml.dump(data, f)
# 读取TOML
with open("config.toml", "r") as f:
config = toml.load(f)
print('toml配置信息:', config["database"]["server"])
适合场景:现代 Python 项目,结构化又简洁。
5. XML 文件 —— 老派企业最爱
XML 在 Java 生态里非常常见,Python 里用得少,主要是写法太啰嗦。
import xml.etree.ElementTree as ET
# 写XML
root = ET.Element("config")
server = ET.SubElement(root, "server")
ET.SubElement(server, "host").text = "localhost"
ET.SubElement(server, "port").text = "8080"
tree = ET.ElementTree(root)
tree.write("config.xml")
# 读XML
tree = ET.parse("config.xml")
root = tree.getroot()
host = root.find("server/host").text
port = root.find("server/port").text
print(host)
print('端口', port)
适合场景:企业级规范,或者要和 Java 系统打交道时。
6. 环境变量(.env 文件)—— 敏感信息守护者
密码、API Key、数据库 URL 这些东西,最适合放 .env。 配合 python-dotenv,特别方便。
from dotenv import load_dotenv
import os
# 加载.env
load_dotenv()
# 读取环境变量
api_key = os.getenv("API_KEY")
database_url = os.getenv("DATABASE_URL")
print('apikey:', api_key)
print('Url:', database_url)
适合场景:存储敏感配置,环境变量管理。
7. Python 文件 —— 直接上本尊
有些框架直接用 .py 做配置(Django 就是)。 灵活性最高,但也意味着安全性和维护性要小心。
# settings.py
DEBUG = True
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'mydatabase'
}
}
适合场景:框架内部、动态计算配置。
四、怎么选?
一句话总结:
- 快速小项目:INI
- 要交换数据:JSON
- 人类友好:YAML
- Python 新项目:TOML
- 敏感信息:.env
- 企业/老系统:XML
- 框架内置:.py
大多数情况下,YAML + TOML + .env 足够覆盖绝大多数 Python 项目需求。
五、最后的话
别小看配置文件,它决定了你的项目是不是“优雅”。 如果配置乱七八糟,项目就会越来越臃肿,哪怕代码写得再漂亮,也会被坑到。
所以,学会正确地管理配置,其实就是在给未来的自己减负。
这篇文章,我把 7 种常见方式的特点、优缺点和 Python 读写代码都整理好了。建议收藏,平时写项目直接拿来用,少踩坑。
如果觉得有用,点个“赞”吧。
相关推荐
- 《Queendom》宣布冠军!女团MAMAMOO四人激动落泪
-
网易娱乐11月1日报道据台湾媒体报道,南韩女团竞争回归的生死斗《Queendom》昨(10/31)晚播出大决赛,并以直播方式进行,6组女团、女歌手皆演唱新歌,并加总前三轮的赛前赛、音源成绩与直播现场投...
- 正确复制、重写别人的代码,不算抄袭
-
我最近在一篇文章提到,工程师应该怎样避免使用大量的库、包以及其他依赖关系。我建议的另一种方案是,如果你没有达到重用第三方代码的阈值时,那么你就可以自己编写代码。在本文中,我将讨论一个在重用和从头开始编...
- HTML DOM tr 对象_html event对象
-
tr对象tr对象代表了HTML表格的行。HTML文档中出现一个<tr>标签,就会创建一个tr对象。tr对象集合W3C:W3C标签。集合描述W3Ccells返回...
- JS 打造动态表格_js如何动态改变表格内容
-
后台列表页最常见的需求:点击表头排序+一键全选。本文用原生js代码实现零依赖方案,涵盖DOM查询、排序算法、事件代理三大核心技能。效果速览一、核心思路事件入口:为每个<th>绑...
- 连肝7个晚上,总结了66条计算机网络的知识点
-
作者|哪吒来源|程序员小灰(ID:chengxuyuanxiaohui)计算机网络知识是面试常考的内容,在实际工作中经常涉及。最近,我总结了66条计算机网络相关的知识点。1、比较http0....
- Vue 中 强制组件重新渲染的正确方法
-
作者:MichaelThiessen译者:前端小智来源:hackernoon有时候,依赖Vue响应方式来更新数据是不够的,相反,我们需要手动重新渲染组件来更新数据。或者,我们可能只想抛开当前的...
- 为什么100个前端只有1人能说清?浏览器重排/重绘深度解析
-
面试现场的"致命拷问""你的项目里做过哪些性能优化?能具体讲讲重排和重绘的区别吗?"作为面试官,我在秋招季连续面试过100多位前端候选人,这句提问几乎成了必考题。但令...
- HTML DOM 介绍_dom4j html
-
HTMLDOM(文档对象模型)是一种基于文档的编程接口,它是HTML和XML文档的编程接口。它可以让开发人员通过JavaScript或其他脚本语言来访问和操作HTML和XML文档...
- JavaScript 事件——“事件流和事件处理程序”的注意要点
-
事件流事件流描述的是从页面中接收事件的顺序。IE的事件流是事件冒泡流,而NetscapeCommunicator的事件流是事件捕获流。事件冒泡即事件开始时由最具体的元素接收,然后逐级向上传播到较为不...
- 探秘 Web 水印技术_水印制作网页
-
作者:fransli,腾讯PCG前端开发工程师Web水印技术在信息安全和版权保护等领域有着广泛的应用,对防止信息泄露或知识产品被侵犯有重要意义。水印根据可见性可分为可见水印和不可见水印(盲水印)...
- 国外顶流网红为流量拍摄性侵女学生?仅被封杀三月,回归仍爆火
-
曾经的油管之王,顶流网红DavidDobrik复出了。一切似乎都跟他因和成员灌酒性侵女学生被骂到退网之前一样:住在950万美元的豪宅,开着20万美元的阿斯顿马丁,每条视频都有数百万观看...人们仿佛...
- JavaScript 内存泄漏排查方法_js内存泄漏及解决方法
-
一、概述本文主要介绍了如何通过Devtools的Memory内存工具排查JavaScript内存泄漏问题。先介绍了一些相关概念,说明了Memory内存工具的使用方式,然后介绍了堆快照的...
- 外贸独立站,网站优化的具体内容_外贸独立站,网站优化的具体内容有哪些
-
Wordpress网站优化,是通过优化代码、数据库、缓存、CSS/JS等内容,提升网站加载速度、交互性和稳定性。网站加载速度,是Google搜索引擎的第一权重,也是SEO优化的前提。1.优化渲染阻塞。...
- 这8个CSS工具可以提升编程速度_css用什么编译器
-
下面为大家推荐的这8个CSS工具,有提供函数的,有提供类的,有提取代码的,还有收集CSS的统计数据的……请花费两分钟的时间看完这篇文章,或许你会找到意外的惊喜,并且为你的编程之路打开了一扇新的大门。1...
- vue的理解-vue源码 历史 简介 核心特性 和jquery区别 和 react对比
-
一、从历史说起Web是WorldWideWeb的简称,中文译为万维网我们可以将它规划成如下的几个时代来进行理解石器时代文明时代工业革命时代百花齐放时代石器时代石器时代指的就是我们的静态网页,可以欣...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)