首先說明一下
在處理大文件時,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'>
