在自动化测试过程中,为了提高脚本的可读性和降低维护成本,将一些通用信息写入配置文件,将重复使用的方法写成公共模块进行封装,使用时候直接调用即可。
一.简介
.ini文件是Initialization file的缩写,即为初始化文件,是Windows系统配置文件所采用的存储格式,统管Windows的各项配置,一般用户就用Windows提供的各项图形化管理界面就可以实现相同的配置了。但在某些情况,还是要直接编辑ini才方便,一般只有很熟悉Windows才能去直接编辑。
除了windows2003很多其他操作系统下面的应用软件也有*.ini文件,用来配置应用软件以实现不同用户的要求。一般不用直接编辑这些ini文件,应用程序的图形界面即可操作以实现相同的功能。它可以用来存放软件信息、注册表信息等。
二.文件扩展名
配置文件.ini
请注意: 我们所讨论的是项目中的配置文件,它是整个项目共用的,所以它要有一个项目使用的文件名,其后缀是.ini。例如:端口配置 port.ini。
当然ini配置文件的后缀名也不一定必须是“.ini”,也可以是“.cfg”、“.conf”或者是“.txt”。
三.格式
ini配置文件由节、键、值组成。
键值对
【参数】(键=值):
INI所包含的最基本的“元素”就是参数(parameter),每个参数都有一个name和一个value,name和value由等号“=”隔开,name在等号的左边。如:
name=value
Section
所有的参数都是以节(section)为单位结合在一起的。所有的section名称都是独占一行,并且section名字都被方括号包围着。在section声明后的所有parameters都属于该section。一个section没有明显的结束标识符,一个section的开始就是上一个section的结束,或者是文件结束。如:
[section]
注解 (comments)使用分号表示(;),在分号后面的文字,直到该行结尾都全部为注释。
;comment textINI文件的数据格式的例子(配置文件的内容)
例子:
[ipport]
ip=127.0.0.1
port=4723
[user]
username=admin
password:po
四.configparser模块
Python提供的configparser模块主要用于读取配置文件:
#导入configparser模块
import configparser
# 生成ConfigParser对象
config = configparser.ConfigParser()
# 读取配置文件
filename = 'config.ini'
config.read(filename, encoding='utf-8')
4.1 获取节点sections
获取方法:
ConfigParserObject.sections()
以列表形式返回configparser对象的所有节点信息
# 获取所有节点
all_sections = config.sections()
print('sections: ', all_sections)
输出结果:
sections: ['ipport', 'user']
4.2 获取指定节点的的所有配置信息
获取方法:
ConfigParserObject.items(section)
以列表形式返回某个节点section对应的所有配置信息.
# 获取指定节点的配置信息
items = config.items('user')
print(items)
输出结果:
[('username', 'admin'), ('password', 'po')]
4.3 获取指定节点的options(键)
获取方法:
ConfigParserObject.options(section)
以列表形式返回某个节点section的所有key值
# 获取指定节点的options信息
options = config.options('user')
print(options)
输出结果:
['username', 'password']
4.4 获取指定节点下指定option的值
获取方法:
#返回结果是字符串类型
ConfigParserObject.get(section, option)
#返回结果是int类型
ConfigParserObject.getint(section, option)
#返回结果是bool类型
ConfigParserObject.getboolean(section, option)
#返回结果是float类型
ConfigParserObject.getfloat(section, option)
# 获取指定节点指定option的值
name = config.get('user', 'username')
print(name)
输出结果:
admin
4.5 检查section或option是否存在
判读方法:
#判读是否存在section值
ConfigParserObject.has_section(section)
#判断是否存在指定的option值
ConfigParserObject.has_option(section, option)
返回bool值,若存在返回True,不存在返回False
is_username= config.has_option('user','username')
is_users= config.has_option('user','users')
is_section_user=config.has_section('user')
is_section_users=config.has_section('users')
print(is_username)
print(is_users)
print(is_section_user)
print(is_section_users)
输出结果:
True
False
True
False
4.6 添加section
增加方法:
ConfigParserObject.add_section(section)
如果section不存在,则添加节点section;
若section已存在,再执行add操作会报错:configparser.DuplicateSectionError: Section XX already exists
# 添加section
if not config.has_section('remark'):
config.add_section('remark')
config.set('remark', 'info', 'ok')
config.write(open(filename, 'w'))
remark = config.items('remark')
print(remark) # 结果 [('info', 'ok')]
在文件里增加如下:
[remark]
info = ok
4.7 修改或添加指定节点下指定option的值
修改方法:
ConfigParserObject.set(section, option, value)
若option存在,则会替换之前option的值为value;
若option不存在,则会创建optiion并赋值为value
# 修改指定option的值
config.set('user', 'username', 'test')
config.set('user', 'isRemember', 'True')
config.write(open('file.ini', 'w'))
# 重新查看修改后节点信息
items = config.items('user')
print(items)
输出结果:
[('username', 'test'), ('password', 'po'), ('isremember', 'True')]
配置文件内容显示如下:
[user]
username = test
password = po
isremember = True
4.8 删除section或option
删除section方法:
ConfigParserObject.remove_section(section)
若section存在,执行删除操作;
若section不存在,则不会执行任何操作
删除option方法:
ConfigParserObject.remove_option(section, option)
若存在,执行删除操作;
若不存在,则不会执行任何操作;
# 删除section
config.remove_section('remark')# section存在
config.remove_section('no_section') # section不存在
# 删除option
config.remove_option('user', 'isremember')# option存在
config.remove_option('user', 'no_option')# option不存在
config.write(open('file.ini', 'w'))
all_sections = config.sections()
print(all_sections)
options = config.options('user')
print(options)
输出结果:
['ipport', 'user']
['username', 'password']
4.9 写入内容
写入方法:
ConfigParserObject.write(open(filename, 'w'))
对configparser对象执行的一些修改操作,必须重新写回到文件才可生效
五.方法封装
import configparser
class ConfigParser:
@classmethod
def __init__(cls,filename):
cls.cfg_dirt={}
cls.filename=filename
@classmethod
def get_ini_data(cls,sector,item):
value=None
try:
value=cls.cfg_dirt[item]
except KeyError:
cfg = configparser.ConfigParser()
cfg.read(cls.filename, encoding='UTF-8')
value = cfg.get(sector,item)
cls.cfg_dirt[item] = value
finally:
return value