Python 中 configparser 配置文件的读写及封装,配置文件存放数据,方便修改
1. 将程序中不常变化的数据放在配置文件中,有什么好处?
将配置统一放在一起,进行统一管理,方便维护,方便修改
- 配置文件将存放测试数据比如:
- Excel文件名、
- 日志名、
- 用例执行的结果、
- 实际结果和用例执行结果写入到哪一行、
- HTML报告的名称、
- 报告的标题、
- 报告的详细程度、
- 报告的描述信息、
- 测试人员的名字、
- url的地址、
- 登录的账号密码
2. 结构
- 配置文件名以 .conf、.ini 为拓展名的文件叫做配置文件
- 配置文件中使用英文 # ; 进行注释,等号= 与冒号: 意思一样
- 区域名(区分大小写)
- 选项名 = 选项值
[file_path]
cases_path = cases.xlsx
在创建配置文件后,会出现提示信息
3. 读取配置文件基本操作
# 读取配置文件需要导入一个类:configparser (译:康飞哥盘思)系统自带不需要安装 from configparser import ConfigParser # 1.创建配置解析器 config = ConfigParser() # 2.指定读取的配置文件.read(译:瑞德):指定读取的文件名,文件名可以是相对或绝对路径 config.read("testcase.conf", encoding="utf-8") # 3.读取数据-------读取的是哪个区域下的那个选项名 # 方法一:使用方括号["区域名"]["选项名"] one_value = config["file path"]["cases_path"] # 方法二:使用.get("区域名", "选项名") -----推荐使用这个 two_value = config.get("msg", "success_result") # 从配置文件中,使用方括号或者get读取的所有值都是字符串类型 # 可以使用 getboolean (译:给特.堡垒恩)方法获取 bool 类型的数据 config.getboolean("msg", "va1") # 可以使用getboolean方法获取bool类型的数据 # 1、yes、on、true、True ---> 都会读取为布尔类型True # 0、no、off、false、False ---> 都会读取为布尔类型False # 可以使用 getfloat 方法获取 float (译:副楼特)类型的数据 config.getfloat("msg", "value2") # 可以使用 getint 方法获取 int 类型的数据 config.getint("msg", "value1") # 读取列表 one_list = config.get('msg', 'value7') # eval 函数能够将字符串转换为 python 中的内置类型 # 相当如把字符串的引号(单引号或者双引号)去掉之后的类型 # 也能够执行字符串类表达式 one_list = eval(one_list)
# 读取 配置文件下 某个区域的 所有 key、valu
print(config.items('区域名'))
4. 写入配置文件基本操作
---不建议对已有文件进行写入,会覆盖掉源文件
from configparser import ConfigParser # 1.创建配置解析器 config = ConfigParser() # 2.写入配置的时候,不用使用read(read是读) # 构造要写入的数据,嵌套字典的字典 datas = { "file path": { "cases_path": "cases1.xlsx", "log_path": "record_run_result.txt" }, "msg1": { "success_result": "Pass", "fail_result": "Fail" } } # 读取配置写入----config['区域名']['选项名'] for key in datas: config[key] = datas[key] # config相当于一个空字典 # 3.保存到文件 a = 追加,w = 写入 with open("write_config.ini", "w") as file: config.write(file)
5. 配置文件读写数据的封装,会用到 configparser 库(译:康飞哥盘思)
# 封装配置文件 from configparser import ConfigParser class HandleConfig: """ 配置文件读写数据的封装 """ def __init__(self, filename): """ :param filename: 配置文件名 """ self.filename = filename self.config = ConfigParser() # 读取配置文件1.创建配置解析器 self.config.read(self.filename, encoding="utf-8") # 读取配置文件2.指定读取的配置文件 # get_value获取所有的字符串,section区域名, option选项名 def get_value(self, section, option): return self.config.get(section, option) # get_int获取整型,section区域名, option选项名 def get_int(self, section, option): return self.config.getint(section, option) # get_float获取浮点数类型,section区域名, option选项名 def get_float(self, section, option): return self.config.getfloat(section, option) # get_boolean(译:比例恩)获取布尔类型,section区域名, option选项名 def get_boolean(self, section, option): return self.config.getboolean(section, option) # get_eval_data 获取列表,section区域名, option选项名 def get_eval_data(self, section, option): return eval(self.config.get(section, option)) # get 获取后为字符串,再用 eval 转换为列表 @staticmethod def write_config(datas, filename): """ 写入配置操作 :param datas: 需要传入写入的数据 :param filename: 指定文件名 :return: """ # 做校验,为嵌套字典的字典才可以(意思.隐私.谈.ce) if isinstance(datas, dict): # 遍历,在外层判断是否为字典 # 再来判断内层的 values 是否为字典 for value in datas.values(): # 先取出value if not isinstance(value, dict): # 在判断 return "数据不合法, 应为嵌套字典的字典" config = ConfigParser() # 1.创建配置解析器---与写入配置操作一致 for key in datas: # 写入操作 config[key] = datas[key] # config 类似于一个空字典 with open(filename, "w") as file: # 保存到哪个文件filename=需要指定文件名 config.write(file) # return "写入成功" # do_config = HandleConfig('testcase.conf') if __name__ == '__main__': # 读取操作 do_config1 = HandleConfig('testcase.conf') # 读取那个文件 res = do_config1.get_value("msg", "success_result") # 读取什么内容 print(res) # 写入操作 do_config = HandleConfig('write_config.ini') datas = { "file path": { "cases_path": "cases.xlsx", "log_path": "record_run_result.txt" }, "msg": { "success_result": "Pass", "fail_result": "Fail" } } do_config.write_config(datas, "write_config.ini") pass
补充:以 .ini 结尾的配置文件
想将日志的级别、名字单独配置,可修改。.ini 、 .yaml
ConfigParser类、 PyYaml模块
1、实例化
conf = ConfigParser()
2、将文件中的数据读取
conf.read("配置文件路径",encoding="utf-8")
3、读取出来默认是字符串
conf.get(section名字,option名字)
4、支持读取出来为:bool,int,float
conf.getboolean(section,option)
conf.getint(section,option)
conf.getfloat(section,option)
修改操作(了解一下):
1、在已有section下添加/修改 option和value
conf.set(section,option,value)
2、若要新增 section:
conf.add_section(section名字)
3、将1中的变更写入到配置文件当中。
conf.write(open(文件,“w”,encoding=”utf-8”))
from configparser import ConfigParser # 1、实例化 conf = ConfigParser() # 2、将文件中的数据读取 conf.read("log.ini", encoding="utf-8") # 3、使用get函数获取section下的option值 # log必须要有,name也必须存在 value = conf.get("log", "name") print(value) # 结果:py43_xj # 读取log下的所有key value print(conf.items("log")) # 结果:[('name', 'py43_xj'), ('level', 'DEBUG'), ('logfile_name', 'test.log')]
补充:以 .yaml 结尾的配置文件
YAML 是一种简洁的非标记语言。
YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易
基本规则:
1、大小写敏感
2、使用缩进表示层级关系 -
3、禁止使用 tab 缩进,只能使用空格键
4、缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级。
5、使用 # 表示注释
6、字符串可以不用引号标注
yaml 读取后只能是 列表 或字典:只能全部取出来,不能不分数据
1、字典
使用冒号(:)表示键值对,同一缩进的所有键值对属于一个map
#Yaml 方式一(注意冒号后的空格)
platformName: Android
platformVersion: 5.1
2、列表
使用连字符(-)表示,注意-后的空格
- hello
- world
3、scalar,纯量
字符串、数字、布尔值。不可变数据类型。
py读取yaml文件:
1、第三方库:pyyaml模块
2、安装:pip install pyyaml
3、从yaml文件读取数据只有3步:
3.0 引入yaml: import yaml
3.1 打开yaml文件: open函数
3.2 调用yaml.load加载文件对象,为python对象。
示例:
# 整个文件都是字典形式 # 字典形式 user: xiaojian passwd: 11111 port: 3306 host: 127.0.0.1 db_name: nmb_python # 字典里面嵌套 列表 形式 log: - abc - 111 - hello - world # 字典里面嵌套 字典 形式 test: key: value weekend: happy age: 18
===
# 读取出来是个列表 - 123 - 344 - 234 # 列表里面嵌套 字典 - key: value hello: 耶耶 # 列表里面嵌套 列表 - - 123 - 345 - 222 - 121
==
示例:读取 yaml 文件
fs = open(yaml文件路径,encoding="utf-8")
s = yaml.load(fs,yaml.FullLoader)
import yaml with open("db.yaml",encoding="utf-8") as fs: s = yaml.load(fs,yaml.FullLoader) print(s) with open("11.yaml",encoding="utf-8") as fs: s = yaml.load(fs,yaml.FullLoader) print(s) # {'user': 'xiaojian', 'passwd': 11111, 'port': 3306, 'host': '127.0.0.1', 'db_name': 'nmb_python', 'log': ['abc', 111, 'hello', 'world'], 'test': {'key': 'value', 'weekend': 'happy', 'age': 18}} [123, 344, 234, {'key': 'value', 'hello': '耶耶'}, [123, 345, 222, 121]]
py读取yaml文件:
1、第三方库:pyyaml模块
2、安装:pip install pyyaml
3、从yaml文件读取数据只有3步:
3.0 引入yaml: import yaml
3.1 打开yaml文件: open函数
3.2 调用yaml.load加载文件对象,为python对象。