九、读取文件数据

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 ('python1', '123456', '123456')
    2 ('python2', '1234567', '123456')
    3 ('python3', '1234567', '1234567')
    4 ('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')
    
posted @ 2020-02-07 22:40  雨牧  阅读(247)  评论(0编辑  收藏  举报