zoukankan      html  css  js  c++  java
  • Python3 操作Excel

    首先说明一下

    在处理大文件时,openpyxl 的性能不如 xlrd,xlwt等。所以可以读取的时候使用xlrd,写的时候用openpyxl。

    今天遇到一个使用场景:excel存放的是一条条用例,包含表头,需要将这些用例读取出来。单元格存放的有字典等类型。

    实现见代码:

    大体思路是,先获取表头作为列表1:list1。

    然后再将后续各行数据获取:listn,使用dict(zip(list1,listn),组合成字典。

    最后将字典存为List。

    # FileName : Excel.py
    # Author   : Adil
    # DateTime : 2017/12/10 13:08
    # SoftWare : PyCharm
    
    import xlrd
    import os
    from openpyxl.reader.excel import load_workbook
    
    from Wm_Api import readConfig as RC
    
    Rc = RC.ReadConfig()
    
    class Excel(object):
        '''定义一个excel类'''
    
        def __init__(self):
            '初始化基本信息'
    
            self.path = Rc.path
            self.excelPath = os.path.join(self.path,'caseData')
    
        def readExcel(self,excelName,SheetName):
            '读取excel'
    
            self.excelName = os.path.join(self.excelPath,excelName)
    
            self.Rb = xlrd.open_workbook(self.excelName)
    
            self.Rs = self.Rb.sheet_by_name(SheetName)
    
            # 获取行数
            rows = self.Rs.nrows
            # 定义一个dict存放单条用例
            # self.titleDict = dict.fromkeys(self.Rs.row_values(0))
            # 取第一行的表头存为list。
            self.titleList = self.Rs.row_values(0)
            # 定义一个list 存放 所有用例
            self.caseList = []
            for r in range(1,rows):
                rowValues = self.Rs.row_values(r)
                # print(r)
                # print(self.Rs.row_values(r))
                # self.caseInfo = dict.fromkeys(self.Rs.row_values(0),self.Rs.row_values(r))
                # print(self.caseInfo)
                # 将列表组合成 字典 这是 将列表转换为字典的一个方法。
                self.caseDict = dict(zip(self.titleList,rowValues))
                # 下面是将字典转换为列表,
                # print(list(self.caseDict))
                # print(self.caseDict.values())
                # print(self.caseDict)
                # 将字典再拼接为列表。
                self.caseList.append(self.caseDict)
            # print(self.caseList)
            # 返回caseList
            return self.caseList
    
    
    
    
    
    
    
    if __name__ == '__main__':
    
        excel = Excel()
        excel.readExcel('ApiInfo.xlsx','Login')

    注意:这样读取的数据类型都是str。包括表中的字典。读取也是str.

    如果直接拿这个字典来用的话,会报错,如下:

    raise JSONDecodeError("Expecting value", s, err.value) from None
    json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

    处理方法如下:

    这里使用了特殊的函数 eval()

     caseData = caseDict['CaseData']
                caseRun = caseDict['CaseRun']
                print(url1)
                if caseRun == 'Y':
                    if method == 'Post':
                        print(caseDict['CaseName'])
                        print(caseData)
                        print(type(caseData))
                        caseData = eval(caseData)
                        print(type(caseData))
                        # 下面是上面三条打印的结果,看似一样,但是类型不一样。所以需要转为dict
                        # {'username': 'xzyc001', 'password': '111111'}
                        # < class 'str'>
                        # 
                        # < class 'dict'>

    下面插播一条eval的用法

    原文地址:https://www.cnblogs.com/liu-shuai/p/6098246.html

    eval

      功能:将字符串str当成有效的表达式来求值并返回计算结果。

      语法: eval(source[, globals[, locals]]) -> value

      参数:

        source:一个Python表达式或函数compile()返回的代码对象

        globals:可选。必须是dictionary

        locals:可选。任意map对象

      实例展示:

    可以把list,tuple,dict和string相互转化。
    #################################################
    字符串转换成列表
    >>>a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
    >>>type(a)
    <type 'str'>
    >>> b = eval(a)
    >>> print b
    [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
    >>> type(b)
    <type 'list'>
    #################################################
    字符串转换成字典
    >>> a = "{1: 'a', 2: 'b'}"
    >>> type(a)
    <type 'str'>
    >>> b = eval(a)
    >>> print b
    {1: 'a', 2: 'b'}
    >>> type(b)
    <type 'dict'>
    #################################################
    字符串转换成元组
    >>> a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
    >>> type(a)
    <type 'str'>
    >>> b = eval(a)
    >>> print b
    ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
    >>> type(b)
    <type 'tuple'>
  • 相关阅读:
    规则引擎集成接口(一)初始体验
    转载--Defunct僵尸进程
    转载--sigprocmask阻塞进程
    转载--__attribute__ 你知多少?
    转载--va_list
    转载--如何使用# ## ... _ _VA_ARGS_ _
    转载--C语言中的__FILE__、__LINE__和__func__
    转载--wait waitpid解释
    转载--c语言宏定义(1)
    转载--c语言宏定义(2)
  • 原文地址:https://www.cnblogs.com/BlueSkyyj/p/8018511.html
Copyright © 2011-2022 走看看