美文网首页
数据驱动 | python读取excel&yaml文件

数据驱动 | python读取excel&yaml文件

作者: Root_123 | 来源:发表于2019-02-25 13:34 被阅读1次

    EXCEL

    首先下载安装xlrd和xlwt这两个库。
      1、打开excel


    image.png
       readbook = xlrd.open_workbook(r'\test\canying.xlsx')
    

    2、获取读入的文件的sheet

        sheet = readbook.sheet_by_index(1)#索引的方式,从0开始
        sheet = readbook.sheet_by_name('sheet2')#名字的方式
    

    3、获取sheet的最大行数和列数

        nrows = sheet.nrows#行
        ncols = sheet.ncols#列
    

    4、获取某个单元格的值

        lng = table.cell(i,3).value#获取i行3列的表格值
        lat = table.cell(i,4).value#获取i行4列的表格值
    

    5、打开将写的表并添加sheet

        writebook = xlwt.Workbook()#打开一个excel
        sheet = writebook.add_sheet('test')#在打开的excel中添加一个sheet
    

    6、将数据写入excel

         sheet.write(i,0,result[0])#写入excel,i行0列
         sheet.write(i,1,result[1])
    

    7、保存

         writebook.save('answer.xls')#一定要记得保存
    

    例如:
    file_reader.py

    class ExcelReader:
        """
        读取excel文件中的内容。返回list。
    
        如:
        excel中内容为:
        | A  | B  | C  |
        | A1 | B1 | C1 |
        | A2 | B2 | C2 |
    
        如果 print(ExcelReader(excel, title_line=True).data),输出结果:
        [{A: A1, B: B1, C:C1}, {A:A2, B:B2, C:C2}]
    
        如果 print(ExcelReader(excel, title_line=False).data),输出结果:
        [[A,B,C], [A1,B1,C1], [A2,B2,C2]]
    
        可以指定sheet,通过index或者name:
        ExcelReader(excel, sheet=2)
        ExcelReader(excel, sheet='BaiDuTest')
        """
        def __init__(self, excel, sheet=0, title_line=True):
            if os.path.exists(excel):
                self.excel = excel
            else:
                raise FileNotFoundError('文件不存在!')
            self.sheet = sheet
            self.title_line = title_line
            self._data = list()
    
        @property
        def data(self):
            if not self._data:
                workbook = open_workbook(self.excel)
                if type(self.sheet) not in [int, str]:
                    raise SheetTypeError('Please pass in <type int> or <type str>, not {0}'.format(type(self.sheet)))
                elif type(self.sheet) == int:
                    s = workbook.sheet_by_index(self.sheet)
                else:
                    s = workbook.sheet_by_name(self.sheet)
    
                if self.title_line:
                    title = s.row_values(0)  # 首行为title
                    for col in range(1, s.nrows):
                        # 依次遍历其余行,与首行组成dict,拼到self._data中
                        # 以下实例展示了zip的使用方法:
                        # >> > a = [1, 2, 3]
                        # >> > b = [4, 5, 6]
                        # >> > c = [4, 5, 6, 7, 8]
                        # >> > zipped = zip(a, b)  # 打包为元组的列表
                        # [(1, 4), (2, 5), (3, 6)]
                        # >> > zip(a, c)  # 元素个数与最短的列表一致
                        # [(1, 4), (2, 5), (3, 6)]
                        self._data.append(dict(zip(title, s.row_values(col))))
                else:
                    for col in range(0, s.nrows):
                        # 遍历所有行,拼到self._data中
                        self._data.append(s.row_values(col))
            return self._data
    

    test_baidu.py

    from utils.file_reader import ExcelReader
    
    class TestBaiDu(unittest.TestCase):
        URL = Config().get('URL')
        excelfile = DATA_PATH + '/baidu.xlsx'
    
        def sub_setUp(self):
            self.page = BaiDuMainPage(browser_type='chrome').get(self.URL, maximize_window=False)
    
        def sub_tearDown(self):
            self.page.quit()
    
        def test_search(self):
            datas = ExcelReader(self.excelfile).data
            for d in datas:
                with self.subTest(data=d):    #在测试用例中使用subTest()重复测试某个用例,其没有setup和teardown,需手动添加
                    self.sub_setUp()
                    self.page.search(d['search'])
                    time.sleep(2)
                    self.page = BaiDuResultPage(self.page)  # 页面跳转到result page
                    links = self.page.result_links
                    for link in links:
                        logger.info(link.text)
                    self.sub_tearDown()
    

    YAML

    导入yaml包
    file_reader.py

    import yaml
    
    class YamlReader:
        def __init__(self,yamlfile):
            if os.path.exists(yamlfile):
                self.yamlfile=yamlfile
            else:
                raise FileNotFoundError("文件不存在!")
            self._data=None
    
        @property
        def data(self):
            # 如果是第一次调用data,读取yaml文档,否则直接返回之前保存的数据
            if not self._data:
                with open(self.yamlfile, 'rb') as f:
                    self._data = list(yaml.safe_load_all(f))  # load后是个generator,用list组织成列表
            return self._data
    

    config.py读取配置

    import os
    from utils.file_reader import YamlReader
    
    class Config:
        def __init__(self, config=CONFIG_FILE):
            self.config = YamlReader(config).data
    
        def get(self, element, index=0):
            """
            yaml是可以通过'---'分节的。用YamlReader读取返回的是一个list,第一项是默认的节,如果有多个节,可以传入index来获取。
            这样我们其实可以把框架相关的配置放在默认节,其他的关于项目的配置放在其他节中。可以在框架中实现多个项目的测试。
            """
            return self.config[index].get(element)
    

    最后:

    description = Config().get('DESCRIPTION')    #DESCRIPTION是配置文件config.yml里的
    

    调用就行。

    相关文章

      网友评论

          本文标题:数据驱动 | python读取excel&yaml文件

          本文链接:https://www.haomeiwen.com/subject/qfawyqtx.html