Python3读写ini配置文件的示例


Posted in Python onNovember 06, 2020

ini文件即Initialization File初始化文件,在应用程序及框架中常作为配置文件使用,是一种静态纯文本文件,使用记事本即可编辑。
配置文件的主要功能就是存储一批变量和变量值,在ini文件中使用[章(Section)]对变量进行了分组,基本格式如下。

# filename: config.ini
[user]
name=admin
password=123456
is_admin=true

[mysql]
host=10.10.10.10
port=3306
db=apitest
user=root
password=123456

[log]
file=run.log
level=info

以上文件中,有3个Section段,分别user、mysql和log。
使用配置文件的好处在于,不用修改代码文件就可以更改使用的用户、数据库以及日志的配置,避免修改代码带来新的bug,或需要重新打包(如Java项目中)。

ini文件中使用#或者;添加注释,最好独占一行,不能写在变量后面

读取

读取ini配置文件需要使用Python3自带的configparser库,使用示例如下

from configparser import ConfigParser  # Python2中是from ConfigParser import ConfigParser
conf = ConfigParser() # 需要实例化一个ConfigParser对象
conf.read('config.ini') # 需要添加上config.ini的路径,不需要open打开,直接给文件路径就读取,也可以指定encoding='utf-8'
print(conf['user']['name']) # 读取user段的name变量的值,字符串格式

conf对象每个section段的数据类似于一个字典,可以使用['变量名']或者.get('变量名')获取对应的值,获取到的是字符串格式。
其他常用的读取方法如下:

  • conf.sections(): 获取所有的section名,结果['user', 'mysql', 'log']
  • conf['mysql']['port']: 获取section端port变量的值,字符串格式
  • conf['mysql'].get('port'): 同上,字符串格式
  • conf.get('mysql', 'port'): 同上,字符串格式
  • conf['mysql'].getint('port'): 获取对应变量的整型值
  • conf['mysql'].getfloat('port'): 获取对应变量的浮点型值
  • conf['user'].getboolean('is_admin'): 获取对应变量的布尔值,支持配置为yes/no, on/‘off, true/false 和 1/0,都可以转化为Python中的True/False
  • conf.has_section(section):检查是否有该section
  • conf.options(section):输出section中所有的变量名
  • conf.has_option(section, option):检查指定section下是否有该变量值

如果想遍历一个section所有的变量和值,可以像遍历字典意义操作,示例如下。

for key, value in conf['mysql'].items():
  print(key, value)

注意:ini文件中的变量名是大小写不敏感的,而Section名是大小写敏感的。

公共变量

假如我们每个Section变量组都有一批相同的重复变量,如:

[dev]
# 开发环境
user=admin
password=123456
base_url=http://localhost:7777

[test]
# 测试环境
user=admin
password=123456
base_url=http://test.abc.com

[prod]
# 生产环境
user=admin
password=123456
base_url=http://www.abc.com

对应这种,我们可以设置[DEFAULT]段公用变量,公用变量会自动添加到每一个段中,修改后如下。

[DEFAULT]
user=admin
password=123456

[dev]
# 开发环境
base_url=http://localhost:7777

[test]
# 测试环境
base_url=http://test.abc.com

[prod]
# 生产环境
base_url=http://www.abc.com

在Python文件中使用conf['test']['user']同样能获取到变量的值。

参数化

在ini文件中我们还可以使用%(变量名)s的占位符进行参数化,这种特性被称为Interpolation(插值)。
比如一个接口,不同的参数对应不同的场景,示例如下。

[DEFAULT]
url = %(base_url)s/get?a=%(a)s&b=%(b)s
base_url=https://httpbin.org

[dev]
# 开发环境
base_url=http://localhost:5555
a=1
b=2

[prod-case1]
# 生成环境-场景1
a=1
b=2

[prod-case2]
# 生成环境-场景2
a=kevin
b=male

上例中,我们在[DEFAULT]段设置了一个参数化的公用变量url,其中埋设了三个占位符,%(base_url)s、%(a)s、和%(b)s。
并且我们设置了base_url变量的默认值为https://httpbin.org。
当下面的section中没有覆盖该变量时,如prod-case1和prod-case2中,是用base_url的默认值。

注意:每个section段中,加上默认变量base_url,必须提供所有参数化变量的值,比如此例中每个段最少必须设置a和b的值,否则会报错。

在Python脚本中打印conf['prod-case2']['url'],可以得到组装后的url。

https://httpbin.org/get?a=kevin&b=male

修改保存

conf对象常用的修改如下:

  • conf.add_section(section):添加section
  • conf.set(section, option, value): 在指定section中添加变量和变量值,section必须存在或已添加,value必须为字符串形式,可以设置DEFAULT字段的值
  • conf.remove_option(section, option):移除指定section下指定变量
  • conf.remove_section(section):移除section
  • conf.write(f):保存ini文件

动态组装conf文件,示例如下。

from configparser import ConfigParser
from configparser import ConfigParser

conf = ConfigParser()

# conf.read('httpbin.ini', encoding='utf-8') # 如果新建的话就不需要read,如果修改则需要使用read打开

conf.set('DEFAULT', 'url', '%(base_url)s/get?a=%(a)s&b=%(b)s') # 可以设置DEFAULT段的值
conf.set('DEFAULT', 'base_url', 'https://httpbin.org') # 可以设置DEFAULT段的值
conf.add_section('dev')
conf.set('dev', 'base_url', 'http://localhost:5555')
conf.set('dev', 'a', '1') # 值必须是字符串
conf.set('dev', 'b', '2')

conf['prod-case1'] = {'a': 1, 'b': 2} # 直接使用字典添加多个变量
conf['prod-case2'] = {'a': 'kevin', 'b': 'male'}

print(conf.get('dev', 'url'))
print(conf.get('prod-case1', 'url'))
print(conf.get('prod-case2', 'url'))

# 保存csv
with open('httpbin.ini', 'w', encoding='utf-8') as f:
  conf.write(f)

运行打印结果如下:

http://localhost:5555/get?a=1&b=2
https://httpbin.org/get?a=1&b=2
https://httpbin.org/get?a=kevin&b=male

生成的文件内容如下。

[DEFAULT]
url = %(base_url)s/get?a=%(a)s&b=%(b)s
base_url = https://httpbin.org

[dev]
base_url = http://localhost:5555
a = 1
b = 2

[prod-case1]
a = 1
b = 2

[prod-case2]
a = kevin
b = male

以上就是Python3读写ini配置文件的示例的详细内容,更多关于python 读写ini的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python通过colorama模块在控制台输出彩色文字的方法
Mar 19 Python
玩转python爬虫之爬取糗事百科段子
Feb 17 Python
python用pickle模块实现“增删改查”的简易功能
Jun 07 Python
Python实现将doc转化pdf格式文档的方法
Jan 19 Python
基于python批量处理dat文件及科学计算方法详解
May 08 Python
解决pip install的时候报错timed out的问题
Jun 12 Python
Python 内置变量和函数的查看及说明介绍
Dec 25 Python
PyTorch实现AlexNet示例
Jan 14 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
Mar 11 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
Apr 07 Python
Python 跨.py文件调用自定义函数说明
Jun 01 Python
selenium切换标签页解决get超时问题的完整代码
Aug 30 Python
Python Serial串口基本操作(收发数据)
Nov 06 #Python
python基于exchange函数发送邮件过程详解
Nov 06 #Python
Python Unittest原理及基本使用方法
Nov 06 #Python
python中的yield from语法快速学习
Nov 06 #Python
Python通过字典映射函数实现switch
Nov 06 #Python
Python使用grequests并发发送请求的示例
Nov 05 #Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 #Python
You might like
PHP截取中文字符串的问题
2006/07/12 PHP
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
基于php验证码函数的使用示例
2013/05/03 PHP
PHP使用DES进行加密与解密的方法详解
2013/06/06 PHP
PHP正则表达式入门教程(推荐)
2016/05/18 PHP
PHP设计模式之模板模式定义与用法详解
2018/12/20 PHP
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
基于JavaScript实现继承机制之原型链(prototype chaining)的详解
2013/05/07 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
js网页实时倒计时精确到秒级
2014/02/10 Javascript
javascript实时显示当天日期的方法
2015/05/20 Javascript
jquery图片轮播特效代码分享
2020/04/20 Javascript
animate 实现滑动切换效果【实例代码】
2016/05/05 Javascript
通过vue-cli来学习修改Webpack多环境配置和发布问题
2017/12/22 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
webpack配置打包后图片路径出错的解决
2018/04/26 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
JS中作用域以及变量范围分析
2020/07/18 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
2020/12/08 Vue.js
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
Django自定义manage命令实例代码
2018/02/11 Python
Python中的函数作用域
2018/05/07 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
2018/06/14 Python
python3基于TCP实现CS架构文件传输
2018/07/28 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
docker django无法访问redis容器的解决方法
2019/08/21 Python
Python大数据之使用lxml库解析html网页文件示例
2019/11/16 Python
python3利用Axes3D库画3D模型图
2020/03/25 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
用python对excel查重
2020/12/07 Python
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
Whistles官网:英国女装品牌
2020/08/14 全球购物
骨干教师培训制度
2014/01/13 职场文书
大学生演讲稿
2014/04/25 职场文书
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python