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'>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM