Python读取ini配置文件

Python配置文件解析
本文介绍如何使用Python的ConfigParser模块来读取和修改INI配置文件,实现动态配置数据库连接参数等功能。

需求:

写个项目,用到数据库,多个地方使用,不能硬编码。很类似java的properties文件

Python支持ini文件的读取


涉及模块:

ConfigParser


xml文件

  1. db_config.ini  
  2. [baseconf]  
  3. host=127.0.0.1  
  4. port=3306  
  5. user=root  
  6. password=root  
  7. db_name=evaluting_sys  
  8. [concurrent]  
  9. processor=20  

对应的python代码

  1. #!/usr/bin/python  
  2. # -*- coding:utf-8 -*-  
  3. #author: lingyue.wkl  
  4. #desc: use to db ops  
  5. #---------------------  
  6. #2012-02-18 created  
  7.   
  8. #---------------------  
  9. import sys,os  
  10. import ConfigParser  
  11.   
  12. class Db_Connector:  
  13.   def __init__(self, config_file_path):  
  14.     cf = ConfigParser.ConfigParser()  
  15.     cf.read(config_file_path)  
  16.   
  17.     s = cf.sections()  
  18.     print 'section:', s  
  19.   
  20.     o = cf.options("baseconf")  
  21.     print 'options:', o  
  22.   
  23.     v = cf.items("baseconf")  
  24.     print 'db:', v  
  25.   
  26.     db_host = cf.get("baseconf""host")  
  27.     db_port = cf.getint("baseconf""port")  
  28.     db_user = cf.get("baseconf""user")  
  29.     db_pwd = cf.get("baseconf""password")  
  30.   
  31.     print db_host, db_port, db_user, db_pwd  
  32.   
  33.     cf.set("baseconf""db_pass""123456")  
  34.     cf.write(open("config_file_path""w"))  
  35. if __name__ == "__main__":  
  36.   f = Db_Connector("../conf/db_config.ini")  

得到结果:

section: ['concurrent', 'baseconf']
options: ['host', 'db_name', 'user', 'password', 'port']
db: [('host', '127.0.0.1'), ('db_name', 'evaluting_sys'), ('user', 'root'), ('password', 'root'), ('port', '3306')]
127.0.0.1 3306 root root


---------------------------------------------update 2012-09-02

通用模块:支持命令行+import两种形式

ini_op.py

  1. #!/usr/bin/python  
  2. # -*- coding:utf-8 -*-  
  3. #author: lingyue.wkl  
  4. #desc: use to read ini  
  5. #---------------------  
  6. #2012-02-18 created  
  7. #2012-09-02 changed for class support  
  8.   
  9. #---------------------  
  10. import sys,os,time  
  11. import ConfigParser  
  12.   
  13.   
  14. class Config:  
  15.     def __init__(self, path):  
  16.         self.path = path  
  17.         self.cf = ConfigParser.ConfigParser()  
  18.         self.cf.read(self.path)  
  19.     def get(self, field, key):  
  20.         result = ""  
  21.         try:  
  22.             result = self.cf.get(field, key)  
  23.         except:  
  24.             result = ""  
  25.         return result  
  26.     def set(self, filed, key, value):  
  27.         try:  
  28.             self.cf.set(field, key, value)  
  29.             cf.write(open(self.path,'w'))  
  30.         except:  
  31.             return False  
  32.         return True  
  33.               
  34.               
  35.   
  36. def read_config(config_file_path, field, key):   
  37.     cf = ConfigParser.ConfigParser()  
  38.     try:  
  39.         cf.read(config_file_path)  
  40.         result = cf.get(field, key)  
  41.     except:  
  42.         sys.exit(1)  
  43.     return result  
  44.   
  45. def write_config(config_file_path, field, key, value):  
  46.     cf = ConfigParser.ConfigParser()  
  47.     try:  
  48.         cf.read(config_file_path)  
  49.         cf.set(field, key, value)  
  50.         cf.write(open(config_file_path,'w'))  
  51.     except:  
  52.         sys.exit(1)  
  53.     return True  
  54.   
  55. if __name__ == "__main__":  
  56.    if len(sys.argv) < 4:  
  57.       sys.exit(1)  
  58.   
  59.    config_file_path = sys.argv[1]   
  60.    field = sys.argv[2]  
  61.    key = sys.argv[3]  
  62.    if len(sys.argv) == 4:  
  63.       print read_config(config_file_path, field, key)  
  64.    else:  
  65.       value = sys.argv[4]  
  66.       write_config(config_file_path, field, key, value) 
<think>好的,我需要回答用户关于如何用Python读取INI配置文件的问题。首先,用户提到了configparser模块,根据提供的引用内容,我应该整合这些信息。 首先,要导入configparser模块,并创建一个ConfigParser对象。用户可能需要知道如何读取文件,所以需要给出config.read('config.ini')的示例代码。然后,展示如何获取配置项,比如使用sections()列出所有部分,用get()方法获取具体的键值对。引用[1]和[2]提到了这些基本操作,可以引用它们。 接下来,用户可能需要处理不同类型的数据,比如整数或布尔值。这时候应该提到getint()、getboolean()等方法,如引用[2]中的示例。同时,可以加入异常处理,说明如何处理不存在的键或文件不存在的情况,这部分引用[3]中的写入操作可能不相关,但引用[4]的配置文件结构可以作为示例。 最后,生成相关问题时要涵盖INI配置文件的更多操作,比如写入、高级应用、常见错误处理等,确保覆盖用户可能关心的其他方面。需要检查是否符合格式要求,比如行内公式的正确使用,但在这个问题中可能用不到数学表达式,但需要遵循中文回答、代码块格式等要求。 总结步骤:导入模块、读取文件、获取数据、处理不同类型、异常处理、示例代码,并引用相关段落。然后生成相关问题,确保每个步骤都有对应的引用支持,并且代码正确无误。</think>### 如何用 Python 读取 INI 格式的配置文件? #### 步骤说明 1. **导入 configparser 模块** 首先需要导入 Python 内置的 `configparser` 模块,该模块专门用于处理 INI 格式的配置文件[^1]。 2. **创建 ConfigParser 对象** 实例化一个 `ConfigParser` 对象,该对象用于解析和操作配置文件: ```python import configparser config = configparser.ConfigParser() ``` 3. **读取配置文件** 使用 `read()` 方法加载配置文件。例如,读取名为 `config.ini` 的文件: ```python config.read('config.ini') # 返回成功加载的文件列表 ``` 4. **获取配置信息** - **列出所有分区**:通过 `sections()` 方法获取所有分区名称[^2]: ```python print(config.sections()) # 输出示例:['mysql', 'mysqld'] ``` - **读取具体键值**:使用 `get(section, key)` 方法获取指定分区的键值: ```python port = config.get('mysqld', 'port') # 返回字符串 '3306' ``` - **处理不同数据类型**:若需整数或布尔值,可使用 `getint()` 或 `getboolean()`: ```python port = config.getint('mysqld', 'port') # 返回整数 3306 ``` 5. **处理异常情况** - **检查分区或键是否存在**: ```python if 'mysql' in config: charset = config.get('mysql', 'default-character-set') ``` - **捕获读取错误**: ```python try: config.read('nonexistent.ini') except FileNotFoundError: print("配置文件不存在") ``` #### 完整示例代码 ```python import configparser # 创建对象并读取文件 config = configparser.ConfigParser() config.read('config.ini') # 获取所有分区 print("所有分区:", config.sections()) # 读取具体配置项 if 'mysqld' in config: port = config.getint('mysqld', 'port') print(f"MySQL 端口号: {port}") ``` #### 注意事项 - **文件格式要求**:INI 文件需按 `[section]` 分区定义键值对,例如[^4]: ```ini [mysql] default-character-set = utf8 [mysqld] port = 3306 basedir = c:\mysql-5.7.2 ``` - **路径问题**:若文件不在当前目录,需提供绝对路径,如 `config.read('/path/to/config.ini')`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值