讲师中心 微信公众号
AI工具推荐 视频效率加速

Python如何读取配置文件?configparser详解

浅墨姑娘_7001

浅墨姑娘_7001

发布时间:2025-07-03 11:48:02

|

895人浏览过

|

来源于php中文网

原创

configparser能读取ini风格文件,结构由节、选项组成,支持注释,适用于简单配置。1. 文件格式为[section]下多个key=value或key: value,支持#或;注释;2. 局限性包括不支持嵌套结构、复杂数据类型,仅适合扁平化配置;3. 常见问题如键名默认不区分大小写、值均为字符串需手动转换、路径处理需注意绝对路径;4. 可动态修改并保存配置,通过赋值操作修改选项,调用config.write()写回文件。

Python如何读取配置文件?configparser详解

Python要读取配置文件,尤其是不太复杂的、结构清晰的INI风格文件时,configparser库通常是我的首选。它内置在Python标准库里,用起来非常顺手,能帮助我们把程序配置和代码逻辑清晰地分离。

Python如何读取配置文件?configparser详解

解决方案

假设我们有一个名为 config.ini 的配置文件,内容可能长这样:

Python如何读取配置文件?configparser详解
[database]
host = localhost
port = 5432
user = admin
password = secure_password
; 这是一个注释

[server]
bind_ip = 0.0.0.0
port = 8080
debug_mode = True
max_connections = 100

要读取它,Python代码可以这样写:

立即学习“Python免费学习笔记(深入)”;

import configparser
import os

# 获取当前脚本所在目录,构建config.ini的绝对路径
# 这样即使脚本在不同位置被调用,也能找到配置文件
current_dir = os.path.dirname(os.path.abspath(__file__))
config_file_path = os.path.join(current_dir, 'config.ini')

config = configparser.ConfigParser()

try:
    # 尝试读取配置文件
    config.read(config_file_path, encoding='utf-8')

    # 访问配置项
    print("--- 数据库配置 ---")
    db_host = config['database']['host']
    db_port = config.getint('database', 'port') # 获取整数
    db_user = config.get('database', 'user', fallback='guest') # 带默认值
    print(f"主机: {db_host}")
    print(f"端口: {db_port}")
    print(f"用户: {db_user}")

    print("\n--- 服务器配置 ---")
    server_ip = config['server']['bind_ip']
    server_port = config.getint('server', 'port')
    debug_mode = config.getboolean('server', 'debug_mode') # 获取布尔值
    max_connections = config.getint('server', 'max_connections')
    print(f"绑定IP: {server_ip}")
    print(f"端口: {server_port}")
    print(f"调试模式: {debug_mode}")
    print(f"最大连接数: {max_connections}")

    # 尝试访问不存在的配置项,并提供默认值
    non_existent_value = config.get('server', 'timeout', fallback='60s')
    print(f"超时设置 (不存在则取默认): {non_existent_value}")

except configparser.NoSectionError as e:
    print(f"错误: 配置文件中缺少某个节: {e}")
except configparser.NoOptionError as e:
    print(f"错误: 配置文件中某个节缺少选项: {e}")
except FileNotFoundError:
    print(f"错误: 配置文件 '{config_file_path}' 未找到。请确保它存在于脚本同目录下。")
except Exception as e:
    print(f"读取配置文件时发生未知错误: {e}")

configparser究竟能读懂什么格式的文件?它的局限性在哪?

configparser 的设计初衷就是为了处理INI风格的配置文件,这种格式其实非常简单:它由若干个“节”(section)组成,每个节下面包含多个“选项”(option),每个选项都是一个键值对。节名用方括号 [] 包裹,选项通常是 key = value 或 key: value 的形式。它支持以 # 或 ; 开头的行作为注释。我个人觉得,这种结构对于存储简单的应用程序配置、数据库连接信息、或者一些开关量参数来说,简直是完美契ate。

Python如何读取配置文件?configparser详解

它的局限性也挺明显的。configparser 不支持复杂的嵌套结构,比如像JSON或YAML那样多层级的对象或列表。如果你需要存储一个配置列表,比如多个数据库连接信息,或者一个复杂的网络拓扑结构,configparser 就显得力不从心了。它会把所有值都当作字符串来处理,虽然提供了 getint()、getboolean()、getfloat() 这样的辅助方法进行类型转换,但那也只是针对少数基本类型。一旦你需要更复杂的数据结构,例如一个字典列表或者一个深层嵌套的配置,你可能就需要转向 json 库或者 pyyaml 库了。所以,我的经验是,对于简单的、扁平化的配置,configparser 足够了,但如果需求复杂起来,就得考虑更强大的序列化工具了。

用configparser,我踩过哪些坑?又学到了哪些好习惯?

说实话,刚开始用 configparser 的时候,我也踩过几个小坑,但这些经历也让我学到了不少好习惯。

Python Hardener
Python Hardener

通过完整的安全审查、代码整洁重构、健壮的错误处理、正确的日志记录以及完整的文档字符串覆盖,强化 Python 脚本。

下载

一个常见的“坑”就是默认的键名不区分大小写。比如你配置文件里写的是 DebugMode = True,但代码里你用 config['server']['debugmode'] 也能取到值。这在某些情况下可能导致不易察觉的bug,因为你可能以为大小写敏感,结果发现不是。不过,configparser 在Python 3.2+ 版本中默认是大小写不敏感的,如果你需要严格的大小写匹配,可以在创建 ConfigParser 实例时传入 optionxform=str。我通常会养成习惯,配置文件里的键名都用小写加下划线,保持一致性。

另一个问题是值都是字符串。你从配置文件里读出来的所有值,哪怕看起来是数字或布尔值,configparser 都会先把它当作字符串。如果你直接拿来做数学运算或者逻辑判断,就会出问题。比如 config['server']['port'] 取出来是 '8080',而不是 8080。所以,养成使用 getint()、getfloat()、getboolean() 这些方法的好习惯非常重要。它们会帮你自动完成类型转换,如果转换失败还会抛出 ValueError,这样你就能及时发现配置错误。

再来就是缺少节或选项时的错误处理。如果你尝试访问一个不存在的节或选项,configparser 会抛出 NoSectionError 或 NoOptionError。这在程序运行时是致命的。为了让程序更健壮,我通常会用 config.get('section', 'option', fallback='default_value') 来获取配置,这样即使配置项不存在,程序也能拿到一个默认值继续运行。或者,你也可以用 try...except 块来捕获这些特定的错误,给用户更友好的提示。我个人更倾向于使用 get() 的 fallback 参数,它让代码看起来更简洁。

最后一点,路径问题。有时候我把配置文件放在项目根目录,但脚本在子目录里运行,结果就报 FileNotFoundError。解决这个问题的方法是,在读取配置文件之前,先用 os.path.dirname(os.path.abspath(__file__)) 获取当前脚本的绝对路径,然后用 os.path.join() 来拼接配置文件的完整路径。这样无论脚本在哪里被执行,它都能找到它“身边”的配置文件。这是一个小细节,但能省去不少调试时间。

配置文件读写之外,configparser还能帮我做些什么?比如修改和保存?

configparser 不仅仅能读取配置文件,它还能让你在程序运行时动态地修改配置,并将这些修改保存回文件中。这对于那些需要用户自定义设置、或者程序运行状态需要持久化的场景来说,非常实用。

要修改或添加配置,操作起来也很直观。你可以像操作字典一样去添加新的节,或者修改现有节下的选项值。比如,如果我想在程序里修改数据库的端口,或者添加一个新的日志配置节,我可以这样做:

import configparser
import os

config_file_path = 'config.ini' # 假设配置文件就在当前目录

config = configparser.ConfigParser()
config.read(config_file_path, encoding='utf-8')

# 修改现有配置
if 'database' in config:
    config['database']['port'] = '5433' # 注意,这里赋值时仍然是字符串

# 添加新的节和选项
if 'logging' not in config:
    config['logging'] = {} # 创建一个新节
config['logging']['level'] = 'INFO'
config['logging']['file'] = '/var/log/my_app.log'
config['logging']['max_size'] = '10MB'

# 删除一个选项(如果需要)
# if 'server' in config and 'max_connections' in config['server']:
#     del config['server']['max_connections']

# 将修改后的配置写回文件
try:
    with open(config_file_path, 'w', encoding='utf-8') as configfile:
        config.write(configfile)
    print(f"配置文件 '{config_file_path}' 已成功更新。")
except IOError as e:
    print(f"写入配置文件时发生错误: {e}")

# 再次读取,验证修改
print("\n--- 更新后的配置 ---")
updated_config = configparser.ConfigParser()
updated_config.read(config_file_path, encoding='utf-8')
print(f"数据库新端口: {updated_config['database']['port']}")
if 'logging' in updated_config:
    print(f"日志级别: {updated_config['logging']['level']}")

需要注意的是,当你通过 config['section']['option'] = 'value' 这种方式赋值时,值总是以字符串形式存储的。configparser 在写入时会保持这种字符串形式。当调用 config.write(configfile) 时,它会把当前 ConfigParser 对象内存中的所有配置写回到指定的文件中,覆盖原有内容。所以,在进行写入操作前,最好确保你已经加载了最新的配置文件内容,避免意外覆盖掉未读取的修改。在我看来,这种读写一体的能力让 configparser 在很多小型到中型项目中都能发挥大作用,尤其是在需要用户界面来调整后端配置的场景下,它能省去不少麻烦。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2275

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3662

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1216

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4219

2025.09.10

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3351

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

574

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

562

2026.02.12

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1878

2023.08.03

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn