• 九、读取文件数据


    1. 读取yml文件数据

    yml文件是一种特殊的文件格式,该格式的文件名均以.yml结尾。-表示列表,key: value表示字典。

    • case.yml文件中存放的内容

      -
        title: framwork
        text: selenium
      -
        title: framwork
        text: appium
      -
        title: language
        text: python
      -
        title: language
        text: C语言
      

    1.1 yaml模块读取该文件中的内容

    import yaml
    
    with open('case.yml', mode='r', encoding='utf-8') as f:
        result = yaml.load(f, Loader=yaml.FullLoader)
    
    print(result)
    print(type(result))
    
    # 输出结果
    [{'title': 'framwork', 'text': 'selenium'}, {'title': 'framwork', 'text': 'appium'}, {'title': 'language', 'text': 'python'}, {'title': 'language', 'text': 'C语言'}]
    <class 'list'>
    

    1.2 ddt数据驱动读取该文件中的内容

    import unittest
    from ddt import ddt, file_data
    
    
    @ddt
    class Test_baidu(unittest.TestCase):
    
        @file_data('case.yml')
        def test_baidu01(self, title, text):
            print(title, text)
    
        @file_data('case.yml')
        def test_baidu02(self, **kwargs):
            print(kwargs.get('title'), kwargs.get('text'))
    
    
    if __name__ == '__main__':
        unittest.main()
    
    
    # 输出结果
    framwork selenium
    framwork appium
    language python
    language C语言
    framwork selenium
    framwork appium
    language python
    language C语言
    

    2. 读取xlsx文件数据

    xlsx是excel的一种数据文件格式。

    • case.xlsx文件中存放的数据

      id excepted data
      1 {'url': 'http://www.baidu.com/', 'text': 'selenium'} ('python1', '123456', '123456')
      2 {'url': 'http://www.baidu.com/', 'text': 'appium'} ('python2', '1234567', '123456')
      3 {'url': 'http://www.baidu.com/', 'text': 'python'} ('python3', '1234567', '1234567')
      4 {'url': 'http://www.baidu.com/', 'text': '求职'} ('python4', '123456', '1234567')
    • 读取该文件中的数据

      import openpyxl
      
      
      class Case(object):
          '''
          用来存储用例
          '''
      
          def __init__(self, case):
              '''
              初始化用例
              :param case:zip对象转换成的列表  --> [(key1, value1), (key2, value2), ...]
              '''
              for item in case:
                  # 得到每一个用例对象
                  setattr(self, item[0], item[1])
      
      
      class ReadExcel(object):
          '''
          读取excel表单数据
          '''
      
          def __init__(self, filename, sheetname):
              '''
              :param filename: 需要读取数据的xlsx文件名
              :param sheetname: 需要读取数据的表单名
              '''
              self.filename = filename
              self.workbook = openpyxl.load_workbook(filename)
              self.sheet = self.workbook[sheetname]
      
          def __del__(self):
      
              # 在销毁对象时调用
              self.workbook.close()
      
          def read_data_by_dict(self):
              '''
              按行读取数据
              每个用例存储在一个字典中
              :return: 返回读取到的表单数据
              '''
      
              # 将获取到的表单数据转化成列表格式
              rows_data = list(self.sheet.rows)
      
              # 获取表头信息
              titles = []
              for title in rows_data[0]:
                  titles.append(title.value)
      
              # 获取用例
              cases = []
              for case in rows_data[1:]:
                  # 获取每一行的数据
                  data = []
                  for cell in case:
                      if isinstance(cell.value, str):
                          # 如果为字符串类型,则将其转化为python类型
                          data.append(eval(cell.value))
                      else:
                          data.append(cell.value)
                  # 将表头作为键,对应的数据作为值组成键值对,得到每一个用例
                  case_data = dict(zip(titles, data))
                  # 将得到的用例插入到总用例中
                  cases.append(case_data)
      
              return cases
      
          def read_data_by_obj(self):
              '''
              按行读取数据
              每个用例存储在一个对象中
              :return: 返回读取到的表单数据
              '''
      
              # 将获取到的表单数据转化成列表格式
              rows_data = list(self.sheet.rows)
      
              # 获取表头信息
              titles = []
              for title in rows_data[0]:
                  titles.append(title.value)
      
              # 获取用例
              cases = []
              for case in rows_data[1:]:
                  # 获取每一行的数据
                  data = []
                  for cell in case:
                      if isinstance(cell.value, str):
                          # 如果为字符串类型,则将其转化为python类型
                          data.append(eval(cell.value))
                      else:
                          data.append(cell.value)
                  # 得到表头和数据的对应值
                  case_data = list(zip(titles, data))
                  # 创建一个Case类的对象,用来存储用例数据
                  case_obj = Case(case_data)
                  # 将得到的用例对象插入到总用例中
                  cases.append(case_obj)
      
              return cases
      
          def read_data_by_column(self, column_list):
              '''
              读取指定列的数据
              每个用例存储在一个对象中
              :param column_list: 需要读取的列组成的列表 -->列表类型
              :return: 返回读取到的表单数据
              '''
      
              # 用来存储测试用例
              cases = []
      
              # 用来存储表头信息
              titles = []
      
              for row in range(1, self.sheet.max_row+1):
                  # 判断是否为第一行
                  if row != 1:
                      # 用来存储每一行的数据
                      datas = []
                      for column in column_list:
                          data = self.sheet.cell(row, column).value
                          if isinstance(data, str):
                              datas.append(eval(data))
                          else:
                              datas.append(data)
                      # 定义一个Case类的对象
                      case_obj = Case(list(zip(titles, datas)))
                      # 将每一个用例对象插入到总用例列表中
                      cases.append(case_obj)
                  else:
                      for column in column_list:
                          title = self.sheet.cell(row, column).value
                          titles.append(title)
      
              return cases
      
          def write_data(self, row, column, message):
              '''
              写入数据
              :param row: 写入位置的行号
              :param column: 写入位置的列号
              :param message: 写入位置的内容
              '''
      
              # 写入数据
              self.sheet.cell(row=row, column=column, value=message)
              # 保存文件
              self.workbook.save(self.filename)
      
      
      if __name__ == '__main__':
          read_excel = ReadExcel('case.xlsx', 'Sheet1')
      
          cases1 = read_excel.read_data_by_dict()
          for case in cases1:
              print(case)
      
          cases2 = read_excel.read_data_by_obj()
          for case in cases2:
              print(case.id, case.excepted, case.data)
      
          cases3 = read_excel.read_data_by_column([1, 3])
          for case in cases3:
              print(case.id, case.data)
              
              
      # 输出结果
      {'id': 1, 'excepted': {'url': 'http://www.baidu.com/', 'text': 'selenium'}, 'data': ('python1', '123456', '123456')}
      {'id': 2, 'excepted': {'url': 'http://www.baidu.com/', 'text': 'appium'}, 'data': ('python2', '1234567', '123456')}
      {'id': 3, 'excepted': {'url': 'http://www.baidu.com/', 'text': 'python'}, 'data': ('python3', '1234567', '1234567')}
      {'id': 4, 'excepted': {'url': 'http://www.baidu.com/', 'text': '求职'}, 'data': ('python4', '123456', '1234567')}
      1 {'url': 'http://www.baidu.com/', 'text': 'selenium'} ('python1', '123456', '123456')
      2 {'url': 'http://www.baidu.com/', 'text': 'appium'} ('python2', '1234567', '123456')
      3 {'url': 'http://www.baidu.com/', 'text': 'python'} ('python3', '1234567', '1234567')
      4 {'url': 'http://www.baidu.com/', 'text': '求职'} ('python4', '123456', '1234567')
      1 ('python1', '123456', '123456')
      2 ('python2', '1234567', '123456')
      3 ('python3', '1234567', '1234567')
      4 ('python4', '123456', '1234567')
      
  • 相关阅读:
    为什么说性别字段不适合做索引?
    过程数据的记录(事务问题)
    两个系统操作同一条表记录涉及的事务的坑(依护系统)
    mybatis插件自动生成代码报错。
    ORACLE使用plsql和其他工具进行表结构和数据迁移
    ORACLE获取建表SQL
    学习英语的技巧
    Oracle的用户管理
    Jmeter做压力测试
    强烈推荐(原创亲测)!!!Fiddler抓取https设置详解(图文)
  • 原文地址:https://www.cnblogs.com/aaron-zhou/p/12274975.html
Copyright © 2020-2023  润新知