python 操作配置文件。

news2024/11/26 4:33:38

 

一:配置文件

1. 什么是配置文件

配置文件是为程序配置参数和初始设置的文件。一般为文本文件,以ini,conf,cnf,cfg,yaml等作为后缀名。

例如mysql的配置文件my.cnf内容如下:

[mysqld]
# Only allow connections from localhost
bind-address = 0.0.0.0
mysqlx-bind-address = 127.0.0.1
default_authentication_plugin = mysql_native_password

2.配置文件的作用

通过配置文件可以使得代码中的参数根据配置文件进行动态配置,而不用直接修改代码的内部,减少风险提高代码复用。

经典应用场景

  1. 多个函数调用同一参数,这个时候最好进行配置化,改动配置文件就可以修改所有函数
  2. 某个参数需要能够动态改变

3.常见配置文件

3.1 ini/conf/cnf文件

这类配置文件由节(section),键(key),值(value)由一下格式组成。

[section1]
key1=value1
key2=value2
[section2]
key1=value1

3.2 yaml文件

3.2.1 简介

yaml文件本质上是一种标记语言,和普通的配置文件相比它能表示更为复杂的数据结构。

它的基本语法规则如下:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

# 表示行注释

yaml支持三种数据结构:

  • 对象: 键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典 (dict)
  • 数组: 一组有顺序的值,又称为序列/ 列表(List)
  • 标量:单个值

3.2.2 对象

对象的一组键值对使用冒号结构表示

name: xinlan
person: {name: xinlan, age: 18}

3.2.3 数组

一组连字符开头的行,构成一个数组

- title
- username
- password
args: [title, username, password]

3.2.4 组合结构

对象数组可以结合使用,形成组合结构

name: xinlan
age: 18
hobby: [python, 游戏, sport]
ouxiang: 
  - 
    name: 刘德华
    age: 60
  - 
    name: 任达华
    age: 65

3.2.5 标量

yaml可以表示如下数据类型如下:

  • 字符串 默认字符串不要加引号,如果有特殊字符串,用引号包裹
  • 布尔值 true,false
  • 整数
  • 浮点数
  • Null - 表示null
  • 时间 iso8601 1949-10-01t09:00:00+08:00
  • 日期 1949-10-01

二:解析配置文件

1.ConfigParser模块

python提供内置库ConfigParser用来解析ini格式的配置文件。

[log]
filename=py45.log
debug=false
[mysql]
host=127.0.0.1
database=lemon
user=root
password=123456
port=3306
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/15 21:31
# @Author  : shisuiyi
# @File    : read_ini.py
# @Software: win10 Tensorflow1.13.1 python3.9
from configparser import ConfigParser
 
config = ConfigParser()  # 实例化
config.read('config.ini')  # 读取配置文件
print(config.sections())  # 返回所有的section名称字符串,一列表返回
print(config.options('mysql'))  # 返回指定section下对应的配置项的所有的字符串名称,以列表返回
print(config.items('log'))  # 返回指定section下所有的配置项的键值对,二元元组
print(config.get('mysql', 'port'))
print(config.getint('mysql', 'port'))  # 指定类型,帮我们转换类型
print(config["mysql"]['host'])  # 直接以字典取值的方式读取ini文件

输出

C:\Users\12446\AppData\Local\Programs\Python\Python39\python.exe D:/Lemon/py45/day19/read_ini.py
['log', 'mysql']
['host', 'database', 'user', 'password', 'port']
[('filename', 'py45.log'), ('debug', 'false')]
3306
3306
127.0.0.1
 
Process finished with exit code 0

2.pyyaml模块

python解析yaml文件需要安装第三方库pyyaml

pip安装pip install pyyaml

pyyaml库的使用非常简单,它会将整个yaml配置文件内容解析成一个python字典返回。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/16 20:22
# @Author  : shisuiyi
# @File    : read_yaml.py
# @Software: win10 Tensorflow1.13.1 python3.9
import yaml
 
with open('config.yaml', 'r', encoding='utf-8') as f:
    config = yaml.load(f, Loader=yaml.FullLoader)
    print(config)

输出的是字典

{'log': {'filename': 'py45.log', 'debug': False},
 'mysql': {'host': '127.0.0.1',
  'database': 'lemon',
  'user': 'root',
  'password': '123456',
  'port': 3306}}

3.配置文件解析模块封装

3.1 功能分析

封装前,我们先考虑一下,这个配置文件解析模块需要哪些功能?

  1. 能够处理多种配置文件
  2. 返回值数据结构一致

3.2 封装成函数

封装思路:

  1. 输入参数为配置文件名,以及配置文件字符编码
  2. 根据配置文件名获取配置文件后缀判断配置文件类型,然后分别处理
  3. ini配置文件解析后处理成字典,其实也可以不出处理,ConfigParser对象支持字典格式的取值
  4. ini配置文件解析的一个重要的问题时,不能自动识别配置类型,所以解耦不是很彻底,有时候需要在引用代码中另外处理。
  5. yaml库直接解析数据为一个字典,且自动识别数据类型,不需要做其他处理。

代码封装如下

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/16 20:33
# @Author  : shisuiyi
# @File    : congig_handler.py
# @Software: win10 Tensorflow1.13.1 python3.9
from configparser import ConfigParser
import yaml
 
 
def get_config(filename, encoding='utf-8'):
    """
    获取yaml/ini配置文件中的配置
    @param filename: str 文件名
    @param encoding: 文件字符编码
    """
    # 1. 获取配置文件后缀
    suffix = filename.split('.')[-1]
    # 2.判断类型
    # 3.分别处理
    if suffix in ['yaml', 'yml']:
        with open(filename, 'r', encoding=encoding) as f:
            data = yaml.load(f, Loader=yaml.FullLoader)
 
    else:
        conf = ConfigParser()
        conf.read(filename)
        data = {}
        for section in conf.sections():
            data[section] = dict(conf.items(section))
    # 4. 返回
    return data
 
 
if __name__ == '__main__':
    res = get_config(r'D:\Lemon\py45\day18\config.yaml')
    print(res)

3.3 封装成类

封装思路:

  1. 整体思路和上面的函数封装是一致的
  2. 将解析ini文件和yaml文件的逻辑分开放到两个私有方法中
  3. 因为逻辑本身比较简单,面向对象封装和函数封装没有太多区别
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/16 20:33
# @Author  : shisuiyi
# @File    : congig_handler.py
# @Software: win10 Tensorflow1.13.1 python3.9
from configparser import ConfigParser
import yaml
 
 
class Config:
    def __init__(self, filename, encoding='utf-8'):
        self.filename = filename
        self.encoding = encoding
        self.suffix = self.filename.split('.')[-1]
        if self.suffix not in ['yaml', 'yml', 'cnf', 'conf', 'ini']:
            raise ValueError('不能识别的配置文件后缀:{}'.format(self.suffix))
 
    def parse_ini(self):
        """
        解析ini
        :return:
        """
        conf = ConfigParser()
        conf.read(self.filename)
        data = {}
        for section in conf.sections():
            data[section] = dict(conf.items(section))
        return data
 
    def parse_yaml(self):
        """
        解析yaml
        :return:
        """
        with open(self.filename, 'r', encoding=self.encoding) as f:
            data = yaml.load(f, Loader=yaml.FullLoader)
        return data
 
    def parse(self):
        """
        解析配置文件
        :return:
        """
        if self.suffix in ['yaml', 'yml']:
            return self.parse_yaml()
        else:
            return self.parse_ini()
 
 
if __name__ == '__main__':
    cm = Config(r'D:\Lemon\py45\day20\config.yaml')
    res = cm.parse()
    print(res)

4.应用到项目中

一个框架封装的彻不彻底的标准是能否复用,也即是另外一个项目来用时,不需要修改框架的源码。

在我们目前封装的框架中,耦合高的点有:

  1. 日志器调用时的传参
  2. 用例数据文件的路径
  3. 生成报告时的传参

配置文件config.yaml

log:
  name: py45
  filename: 'D:\Lemon\py45\day18\logs\my.log'
  debug: true
test_cases_dir: 'D:\Lemon\py45\day18\testcases'
test_data_file: 'D:\Lemon\py45\day18\testdata\testdata.xlsx'
test_report:
  report_dir: 'D:\Lemon\py45\day18\reports'
  title: 'py45期第一份测试报告'
  desc: '木森老师的测试报告模板'
  tester: 'shisuiyi'

get_config函数解析后:

{'log': {'name': 'py45',
  'filename': 'D:\\Lemon\\py45\\day18\\logs\\my.log',
  'debug': True},
 'test_cases_dir': 'D:\\Lemon\\py45\\day18\\testcases',
 'test_data_file': 'D:\\Lemon\\py45\\day18\\testdata\\testdata.xlsx',
 'test_report': {'report_dir': 'D:\\Lemon\\py45\\day18\\reports',
  'title': 'py45期第一份测试报告',
  'desc': '木森老师的测试报告模板',
  'tester': 'shisuiyi'}}

我们可以将这些写到配置文件中,然后在框架代码中动态的获取配置文件的相对应设置,实现代码的解耦。

common 文件夹下的 __init__.py的文件中调用解析配置文件的函数

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/13 10:16
# @Author  : shisuiyi
# @File    : __init__.py.py
# @Software: win10 Tensorflow1.13.1 python3.9
from common.log_handler import get_logger
from common.read_excel_tool import get_data_from_excel
from common.congig_handler import get_config
 
 
conf = get_config(r'D:\Lemon\py45\day19\config.yaml')  # 在这里将配置文件解析成字典格式返回
logger = get_logger(**conf['log'])  # 在这里创建日志器----日志器调用时的传参
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/8 21:08
# @Author  : shisuiyi
# @File    : test_login.py
# @Software: win10 Tensorflow1.13.1 python3.9
 
 
cases = get_data_from_excel(conf['test_data_file'], 'login') # ---测试用例数据的路径
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/9 20:14
# @Author  : shisuiyi
# @File    : main.py
# @Software: win10 Tensorflow1.13.1 python3.9
import unittest
import unittestreport
from common import conf
 
 
if __name__ == '__main__':
    discover = unittest.defaultTestLoader.discover(conf['test_cases_dir'])  # 表示收集当前目录下所有用例
    runner = unittestreport.TestRunner(discover, **conf['test_report'])
    runner.run()

总结

以上就是今天为各位小伙伴准备的内容,如果你想了解更多关于Python自动化测试的知识和技巧,欢迎关注!

感谢每一个认真阅读我文章的人,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 资料获取方式:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/662810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java30天拿下---第三天(选择,循环,二重循环语句,输入,调试,标签)

Java30天拿下---第三天 一 流程图二 选择结构简单的if-else嵌套的if-else多重if的选择语句(else-if)switch语句 二 输入验证三 程序调试四 循环结构while循环do-while循环for循环流程控制二重循环(重点) 五 标签 label&#xff08…

中国移动云能力中心捐赠 secScanner 和 ksPack 项目,助力openEuler社区繁荣发展

2023 开放原子全球开源峰会于 6 月 11 日至 13 日在全球数字经济大会期间召开。本届大会以“开源赋能、普惠未来”为主题,全面展示开源技术应用,聚焦全球开源生态最新发展与前沿技术动态。中国移动云能力中心张胜举出席本次大会,并代表移动云…

618仿冒百出,如何保护品牌不受侵害|上云那些事

随着直播带货的兴起,如今的618,更多消费者选择在直播间下单。与传统电商不同的消费体验背后,是消费模式和销售渠道的改变,而与传统电商比较成熟的渠道风控相比,直播间则成为了不法分子潜伏的温床:大量号称“…

电能质量监测和分析仪器的设计与应用

安科瑞虞佳豪 随着电气环境中自动化程度的提高,以电力电子技术为代表的各种整流、逆变、变频等非线性负载比重不断变大,加之调控手段不完善及外来干扰等原因,使得电能质量下降。基于计算机、微处理器控制的电子仪器在国民经济企业中大量使用,对供电质量的敏感程度越来越高,对电…

Go语言精进之路读书笔记—第二章项目结构、代码风格与标识符命名

上面是go语言库项目结构,细节补充如下: cmd目录: 存放项目要构建的可执行文件对应的main包源文件。 pkg目录: 项目自身要使用并且同样也是可执行文件对应main包要依赖的库文件。 makefile: 代码任何第三方构建工具脚本…

二、Kibana简介与安装

目录 1、下载 2、安装 3、启动运行 4、访问http://localhost:5601 5、使用kibana工具查询elasticsearch 6、汉化kibana Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana…

虹科教您 | 多功能时间敏感网络流量记录仪RELY-TSN-REC操作指南与基本功能测试

1. 设备描述 RELY-TSN-REC 是一款基于 RELYUM 灵活开放平台的强大网络流量记录器。 该设备可以使用 IEEE 802.1AS 通过连接到专用端口的外部主时钟进行同步,并为捕获的流量提供精确的时间戳。该设备可以安装在时间敏感网络(TSN)以太网网络中,并可以在TA…

VCL界面控件DevExpress VCL v23.1.3全新首发 - 支持Windows 11新主题

DevExpress VCL Controls是Devexpress公司旗下最老牌的用户界面套包,所包含的控件有:数据录入、图表、数据分析、导航、布局等。该控件能帮助您创建优异的用户体验,提供高影响力的业务解决方案,并利用您现有的VCL技能为未来构建下…

公开信发起人Tegmark:中国得天独厚,为AI安全和治理做贡献丨2023智源大会回顾...

导读 近日,MIT教授、「暂停大型AI实验」公开信的发起人之一Max Tegmark发表了题为「如何掌控 AI」的精彩演说,介绍了发展可控 AI 的重要意义,提出了通过「机械可解释性」实现可控 AI 的技术路线,同时也肯定了中国在 AI 安全领域的…

2自由度并联仿生腿的制作

1. 运动功能说明 本文实例将实现2自由度并联仿生腿模组运动起来,模拟实现狗腿行走的动作。 2. 结构说明 2自由度并联仿生腿模组是由两个舵机驱动的,它的所有动作都将在两个舵机的配合运动下实现。 3. 运动原理说明 2自由度并联仿生腿模组运动的点位如下…

【Vue】学习笔记-Vue UI组件库

学习笔记-Vue UI组件库 常用UI组件库移动端常用UI组件库PC端常用UI组件库element-ui 基本使用element-ui 按需引入 常用UI组件库 移动端常用UI组件库 VantCube UIMint UIhttps://nutui.jd.com/#/ PC端常用UI组件库 Element UIIView UI element-ui 基本使用 安装element:n…

使用three.js渲染第一个场景和物体

一、效果图: 二、渲染场景和物体的步骤 创建场景(Scene):在 three.js 中创建场景通过调用 THREE.Scene() 方法,然后将其赋值给变量。 var scene new THREE.Scene(); 创建相机(Camera):在 three.js 中创建相机通过调用 THREE.Pe…

什么是量词符?怎样理解量词符?

量词符用来设定某个模式出现的次数,通过使用量词符(?、、*、)能够完成某字符连续出现的匹配。具体如表所示。 上表中,“…”表示多次。为了更好地理解量词符的使用,下面我们以a字符为例进行演示,示例代码如下。 var reg /~a*…

CSC公派访问学者申请的几个重要步骤

CSC(中国国家留学基金委员会)公派访问学者项目为有志于在国外进一步深造、学术交流的学者提供了宝贵的机会。然而,在申请过程中需要注意一些重要的步骤,以确保申请的顺利进行。下面知识人网小编将为您介绍几个关键的申请步骤。 第…

Python代码覆盖率分析工具Coverage

目录 简介 安装 命令行中使用 调用API使用 简介 Coverage是一个Python代码覆盖率分析工具,它可以用于衡量Python测试代码的质量。通过给代码执行带来的覆盖率数据,Coverage可以帮助开发人员找出被回归测试代码中的漏洞,并且指明哪些代码…

c++类的导出和函数的修饰名

(一)c中类的导出方法 类前面添加__declspec(dllexport) 头文件如下定义: #pragma onceclass __declspec(dllexport) TestClass {int myint;double mydouble;float myfloat; private:int myfun0(float* f1, int* i2);public:TestClass();~…

发现 7 个 PM 优先级框架并立即获取 7 个免费模板

需求的优先级是项目经理工作中常被提及的,每一种优先级决策技术都有利有弊,也有对应的应用场景,如何选择合适的优决策技术,是产品经理做好优先级管理的前提。那么在项目管理工作中,要如何去评估需求的优先级呢&#xf…

(八) ElasticSearch数据可视化和分析工具Kibana安装和使用

1.概述 Kibana 是一个用于数据可视化和分析的开源工具,它是 Elastic Stack(包括 Elasticsearch、Logstash 和 Beats)的一部分。Kibana 提供了直观、交互式的用户界面,让用户能够以图表、表格、地图等形式实时探索和可视化存储在 …

南卡OE Pro开放式耳机震撼上市,突破音质与舒适度的极限!

南卡在近日又推出了一款全新升级的南卡OE PRO开放式蓝牙耳机,集齐了先进技术与卓越音质于一身,为用户带来无与伦比的音乐体验和舒适感,让您尽情享受自由的音乐之旅,而且有望打破开放式耳机历史记录,成为开放式耳机天花…

【软件教程】农林生环、水文、海洋、水环境、大气科学、人工智能、碳中和、碳排放、3S、R与统计等软件模型

本文涉及领域水文水资源、大气科学、农林生态、地信遥感、统计分析、编程语言等... 从软件基础到实践案例应用操作,手把手教学,提供永久回放观看和助学群长期辅助指导。适合课题组人员一站式学习,科研人员技术提升、企业单位工程项目、高校论…