zoukankan      html  css  js  c++  java
  • python中操作excel、ddt、config、logging方法

    1、操作excel

     1 """
     2 1、使用第三方模块openpyxl  
     3 2、安装:pip install openpyxl
     4 3、文件 .xlsx一定要自己新建(不支持.xls类型)
     5 4、流程:打开工作簿(excel)----定位表单(sheet)---定位单元格---读取值
     6 5、如果是数值类型的(int、float),读取之后的类型是数值类型;如果是其他类型的内容,读取之后的类型是str
     7 
     8 """
     9 
    10 import openpyxl
    11 
    12 from openpyxl import load_workbook
    13 
    14 # 打开Excel:文件放置在当前文件夹中
    15 wb = load_workbook("python.xlsx")  # 返回的是工作簿
    16 
    17 # 定位表单
    18 sheet = wb['name']
    19 
    20 # 定位单元格并取值
    21 result = sheet.cell(2, 2).value
    22 
    23 
    24 # 修改值
    25 sheet.cell(3, 3).value = "修改"  # 赋值语句
    26 
    27 # 保存工作薄【一定要保存,否则修改无效,而且保存的话要先关闭excel,否则报错PermissionError: [Errno 13] Permission denied: 'python.xlsx'】
    28 wb.save("python.xlsx")
    29 
    30 # 获取最大行 最大列
    31 print(sheet.max_row)
    32 print(sheet.max_column)
    View Code

    2、操作ddt

     1 """
     2 1、使用第三方模块ddt  
     3 2、安装:pip install ddt
     4 3、ddt:结合单元测试来做的
     5 4、帮我们拆分数据,传递参数给测试用例
     6 """
     7 
     8 import unittest
     9 from ddt import ddt, data, unpack
    10 
    11 test_data = [[1, 2],
    12              [3, 4]]
    13 
    14 
    15 @ddt  # @ddt 专门装饰测试类
    16 class TestMath(unittest.TestCase):
    17 
    18     @data(test_data)  # @data 专门装饰测试用例
    19     def test_add_1(self, item):  # 使用@data之后,这边要加一个参数来接收
    20         print(item)
    21         # a = 10
    22         # b = 20
    23         a = item[0]
    24         b = item[1]
    25         print("两个数和是", a + b)
    26 
    27 
    28 if __name__ == '__main__':
    29     unittest.main(verbosity=2)
    View Code

    3、操作config

    1)首先新建一个配置文件:case.config,内容如下:FLAG是section;mode,case_id_list是option

    [FLAG]
    mode=on
    case_id_list=[2,4]

    [PYTHON]
    num=87

    2)对该配置文件的操作

     1 """
     2 1、配置文件的分类:.ini  .properties  .config   .conf   .xml
     3 2、本次主要讲文本形式的 
     4 3、configparser模块  专门处理配置文件
     5 4、配置文件的数据读取都是字符串类型
     6 """
     7 
     8 import configparser
     9 class ReadConfig:
    10     def read_config(self, file_path, section, option):
    11         # 实例化
    12         cf = configparser.ConfigParser()
    13 
    14         # 调用read函数打开配置文件
    15         cf.read(file_path, encoding="utf-8") 
    16 
    17         # 获取数据
    18         value = cf.get(section, option)
    19 
    20         # 获取到的所有数据均是字符串,想要还原成本身的数据类型使用eval()函数
    21         # print(eval(value))
    22 
    23         return value
    24 
    25 if __name__ == '__main__':
    26     value = ReadConfig().read_config("case.config", "FLAG", "mode")
    27     print(value)
    View Code

    4、操作logging

     1 """
     2 1、日志:记录系统的操作  记录代码的运行
     3 2、模块logging,不需要安装python自带的
     4 3、log日志分为5个级别:debug info warning error critical(crash)
     5 1)从左往右 级别一次加重
     6 2)收集日志:收集器  会有一个名字,默认顶级收集器:root;默认只收集warning(包含)以上级别的信息
     7 3)输出日志:输出控制台
     8 
     9 
    10 """
    11 
    12 import logging
    13 
    14 
    15 class MyLog:
    16     def my_log(self, level, msg):
    17 
    18         # 定义一个属于自己的日志收集器
    19         my_logger = logging.getLogger("python10")
    20         my_logger.setLevel("DEBUG")  # 设置输出级别 大写或者数字
    21 
    22         # 创造一个专属输出渠道  过滤  和排版; 格式如下:
    23         formatter = logging.Formatter('%(asctime)s-%(levelname)s-%(filename)s-%(name)s-日志信息:%(message)s')
    24 
    25         # 输出日志,方法一:输出到控制台
    26         ch = logging.StreamHandler()  # 输出到控制台
    27         ch.setLevel("DEBUG")  # 设置输出级别 大写或者数字
    28         ch.setFormatter(formatter)
    29 
    30         # 输出日志,方法二:输出到指定文件
    31         fh = logging.FileHandler('python10.txt', encoding="utf-8")  # 输出到指定文件
    32         fh.setLevel("DEBUG")  # 设置输出级别 大写或者数字
    33         fh.setFormatter(formatter)
    34 
    35         # 对接起来  给日志收集器添加一个渠道【最后输出的是收集和输出的级别的交集】
    36         my_logger.addHandler(ch)
    37         my_logger.addHandler(fh)
    38 
    39         if level == "DEBUG":
    40             my_logger.debug(msg)
    41         elif level == "INFO":
    42             my_logger.info(msg)
    43         elif level == "WARNING":
    44             my_logger.warning(msg)
    45         elif level == "ERROR":
    46             my_logger.error(msg)
    47         elif level == "CRITICAL":
    48             my_logger.critical(msg)
    49         # 渠道要删除,否则日志输出会重复
    50         my_logger.removeHandler(ch)
    51         my_logger.removeHandler(fh)
    52 
    53     def debug(self, msg):
    54         self.my_log("DEBUG", msg)
    55 
    56     def info(self, msg):
    57         self.my_log("INFO", msg)
    58 
    59     def warning(self, msg):
    60         self.my_log("WARNING", msg)
    61 
    62     def error(self, msg):
    63         self.my_log("ERROR", msg)
    64 
    65     def critical(self, msg):
    66         self.my_log("CRITICAL", msg)
    67 
    68 
    69 if __name__ == '__main__':
    70     my_logger = MyLog()
    71     my_logger.debug("天呢")
    72     my_logger.info("小意思")
    73     my_logger.warning("警告咯")
    74     my_logger.error("发生错误咯")
    75     my_logger.critical("崩溃哈哈哈")
    View Code

    logging.basicConfig函数各参数:

    filename: 指定日志文件名

    filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'

    format: 指定输出的格式和内容,format可以输出很多有用信息,如代码中所示:

     %(levelno)s: 打印日志级别的数值

     %(levelname)s: 打印日志级别名称

     %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]

     %(filename)s: 打印当前执行程序名

     %(funcName)s: 打印日志的当前函数

     %(lineno)d: 打印日志的当前行号

     %(asctime)s: 打印日志的时间

     %(thread)d: 打印线程ID

     %(threadName)s: 打印线程名称

     %(process)d: 打印进程ID

     %(message)s: 打印日志信息

    datefmt: 指定时间格式,同time.strftime()

    level: 设置日志级别,默认为logging.WARNING

    stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

  • 相关阅读:
    Delphi数据类型转换
    js截取指定长度字符
    Internet Explorer无法打开站点,已终止操作
    关于最近做项目的一点点总结
    屏蔽右键菜单
    屏蔽回车自动提交
    自己写的一个客户端验证js
    如何播放声音文件
    如何:使用 CodeDOM 创建类
    js操作dom(4)关于xml节点属性的操作
  • 原文地址:https://www.cnblogs.com/lctest/p/12158091.html
Copyright © 2011-2022 走看看