excel sheet限制_Python 處理Excel內的資料(案例介紹*3)
阿新 • • 發佈:2021-01-03
技術標籤:excel sheet限制
點選上方“藍字”關注我們瞭解更多精彩 案例一介紹現在有一批電商產品跟當日銷量的資料,如下,總共有上萬筆的資料,現在需要統計每個品牌當日的銷售量,比如美寶蓮今天總共賣出了多少的商品,另外需要統計每個品牌下面的每個子品類當日銷售量(品類可分為口紅、睫毛膏、粉底等),比如卡姿蘭口紅賣了多少、眉筆賣了多少。
首先是要做出關鍵字碼表,如下,這些是透過電商常用的產品稱呼和觀察發現的,需要對商品名稱有一定的瞭解,比如歐萊雅的潔面膏其實就是洗面奶
後面就是建立一個list,裡面包含這些子品類,用這些關鍵字和品牌名稱在商品列表逐一做匹配,比如商品裡有“卡姿蘭”又有“口紅”的,再將符合的商品銷售數量累加,輸出至excel裡,就可以完成統計,程式碼如下
最後將輸出的結果做圖展示 案例二介紹importxlrdimport xlwtreadbook = xlrd.open_workbook(r'brand.xlsx')sheet = readbook.sheet_by_index(0)cols1=sheet.col_values(0)cols2=sheet.col_values(1)workbook = xlwt.Workbook(encoding='utf-8')worksheet = workbook.add_sheet('result')#建立子品類清單items = ['眉筆','口紅','眉粉','眼線筆','睫毛膏','粉餅','脣彩','散粉','眼影','脣釉','腮紅','BB霜','粉底液','卸妝水','隔離霜','面霜','香水']k = -1b = 0 #b是記錄總數for item in items: a = 0 #a是某個子品類的數目 array = [] i = -1 k = k+1 for col in cols1: i = i + 1 if (item in col) and ('卡姿蘭' in col): #商品名稱裡包含list裡面的子品類和卡姿蘭 array.append(i) for n in array: a = a+ cols2[n] print(item) print(a) b = b+a worksheet.write(k,0,item) worksheet.write(k,1,a)worksheet.write(k+1,0,'總數')worksheet.write(k+1,1,b)workbook.save('result.xls')
在一個專案中我們需要對使用者的終端機器進行統計,可是介面傳回的資料如下圖,同樣是IPhone卻有上萬種寫法,除了IPhone外,其他的安卓手機像是華為、OPPO、VIVO、小米等都有類似的情況,現在需要將這些分散的資料識別出,並加以統計
流程為:
1、用關鍵字對錶內的內容進行查詢,將包含關鍵字的行記錄。
2、將包含關鍵字行第二列的資料進行加成,並且統計
3、輸出到新的文件裡
首先我們需要先製作一個關鍵字碼表,如下圖,我們將4大安卓機外的安卓機合計到安卓裡面
接著,用xlrd讀取excel,用碼錶內的關鍵字跟第一列的資料進行匹配,符合匹配的將第二列的數字加總,最後用xlwt輸出到excel檔案裡,實現程式碼如下:
importxlrdimport xlwtreadbook = xlrd.open_workbook(r'phone.xlsx')sheet = readbook.sheet_by_index(0)cols1=sheet.col_values(0)cols2=sheet.col_values(1)i = -1a = 0 #記錄數目array = []keywords = ['iphone', 'iPhone', '蘋果', 'Iphone', 'iOS']for col in cols1: i = i + 1 for word in keywords: #匹配清單內的關鍵字 if word in col: array.append(i)for n in array: a = a+ cols2[n]print(a)workbook = xlwt.Workbook(encoding='utf-8')worksheet = workbook.add_sheet('test')worksheet.write(1,1,a)workbook.save('phone1.xls')
最後用EXCEL作圖,就可以完成使用者資料統計
案例三介紹封裝一個讀取用例的excel類:用來實現讀取資料和寫入資料的功能
cases.xlsx的測試資料:1.按行讀取資料,儲存在列表中
import openpyxlclass Case: #這個類用來儲存用例的 __slots__ = [] #特殊的類屬性,可以用來限制這個類建立的例項屬性新增 可寫可不寫 passclass ReadExcel(object): #讀取excel資料的類 def __init__(self,file_name,sheet_name): """ 這個是用來初始化讀取物件的 :param file_name: 檔名 ---> str型別 :param sheet_name: 表單名 ———> str型別 """ # 開啟檔案 self.wb = openpyxl.load_workbook(file_name) # 選擇表單 self.sh = self.wb[sheet_name] def read_data_line(self): #按行讀取資料轉化為列表 rows_data = list(self.sh.rows) # print(rows_data) # 獲取表單的表頭資訊 titles = [] for title in rows_data[0]: titles.append(title.value) # print(titles) #定義一個空列表用來儲存測試用例 cases = [] for case in rows_data[1:]: # print(case) data = [] for cell in case: #獲取一條測試用例資料 # print(cell.value) data.append(cell.value) # print(data) #判斷該單元格是否為字串,如果是字串型別則需要使用eval();如果不是字串型別則不需要使用eval() if isinstance(cell.value,str): data.append(eval(cell.value)) else: data.append(cell.value) #將該條資料存放至cases中 # print(dict(list(zip(titles,data)))) case_data = dict(list(zip(titles,data))) cases.append(case_data) return casesif __name__ == '__main__': r = ReadExcel('cases.xlsx','Sheet1') data1 = r.read_data_line() print(data1)
2.按行讀取資料,儲存在物件中
import openpyxlclass Case: passclass ReadExcel(object): def __init__(self,filename,sheetname): self.wb = openpyxl.load_workbook(filename) self.sh = self.wb[sheetname] def read_data_obj(self): """ 按行讀取資料 每條用例儲存在一個物件中 :return: """ rows_data = list(self.sh.rows) # print(rows_data) # 獲取表單的表頭資訊 titles = [] for title in rows_data[0]: titles.append(title.value) # print(titles) # 定義一個空列表用來儲存測試用例 cases = [] for case in rows_data[1:]: # print(case) #建立一個Case類的物件,用來儲存用例資料 case_obj = Case() data = [] for cell in case: # 獲取一條測試用例資料 # print(cell.value) # data.append(cell.value) # print(data) if isinstance(cell.value,str): # 判斷該單元格是否為字串,如果是字串型別則需要使用eval();如果不是字串型別則不需要使用eval() data.append(eval(cell.value)) else: data.append(cell.value) # 將該條資料存放至cases中 # print(dict(list(zip(titles,data)))) case_data = list(zip(titles, data)) # print(case_data) for i in case_data: setattr(case_obj,i[0],i[1]) # print(case_obj) # print(case_obj.case_id,case_obj.data,case_obj.excepted) cases.append(case_obj) return casesif __name__ == '__main__': r = ReadExcel('cases.xlsx','Sheet1') res = r.read_data_obj() for i in res: print(i.caseid, i.excepted, i.data)
3.將測試用例封裝到列表中,讀取指定列的資料
import openpyxlclass Case: passclass ReadExcelZy(object): def __init__(self,filename,sheetname): self.wb = openpyxl.load_workbook(filename) self.sheet = self.wb[sheetname] # list1 引數為一個列表,傳入的是指定讀取資料的列,比如[1,2,3] # 每一行[1,3,5]列的資料,讀取出來就作為一條測試用例,放在字典中 # 所有的用例放在列表中並且進行返回 def read_data(self,list1): """ :param list1: list--->要讀取列 list型別 :return: 返回一個列表,每一個元素為一個用例(用例為dict型別) """ # 獲取最大的行數 max_r = self.sheet.max_row cases = [] #定義一個空列表,用來存放所有的用例資料 titles = [] #定義一個空列表,用來存放表頭 # 遍歷所有的行資料 for row in range(1,max_r+1): if row != 1: #判斷是否是第一行 case_data = [] #定義一個空列表,用來存放該行的用例資料 for column in list1: info = self.sheet.cell(row,column).value # print(info) case_data.append(info) # print(list(zip(titles,case_data))) case = dict(zip(titles,case_data)) #將該條資料和表頭進行打包組合,作用相當於dict(list(zip(titles,case_data))) # print(case) cases.append(case) # print(cases) else: #獲取表頭資料 for column in list1: title = self.sheet.cell(row,column).value titles.append(title) # print(titles) return casesif __name__ == '__main__': r = ReadExcelZy("cases.xlsx","Sheet1") res = r.read_data([1,2,3]) for o in res: print(o['caseid'],o['data'],o['excepted'])
4.將測試用例封裝到物件中,讀取指定列的資料
import openpyxlclass Case: passclass ReadExcelZy(object): def __init__(self,filename,sheetname): self.wb = openpyxl.load_workbook(filename) self.sheet = self.wb[sheetname] # list1 引數為一個列表,傳入的是指定讀取資料的列,比如[1,2,3] # 每一行[1,3,5]列的資料,讀取出來就作為一條測試用例,放在字典中 # 所有的用例放在物件中並且進行返回 def read_data_obj(self,list2): max_r1 = self.sheet.max_row #獲取最大行數 cases = [] titles = [] #用來存放表頭資料 for row in range(1,max_r1+1): if row != 1: case_data = [] for column in list2: info = self.sheet.cell(row,column).value # print(info) case_data.append(info) cases_data = list(zip(titles,case_data)) #將一條用例存到一個物件中(每一列對應物件的一個屬性) case_obj = Case() for i in cases_data: # print(i) setattr(case_obj,i[0],i[1]) # print(case_obj.caseid,case_obj.excepted,case_obj.data) cases.append(case_obj) else: for column in list2: title = self.sheet.cell(row,column).value titles.append(title) return casesif __name__ == '__main__': r = ReadExcelZy("cases.xlsx","Sheet1") res = r.read_data_obj([1,2,3]) for i in res: print(i.caseid,i.data,i.excepted)
5.優化第4部分程式碼,將設定物件屬性寫在初始化方法中(封裝Excel類讀取資料最常用的方法)
import openpyxlclass Case: # 這個類用來儲存用例的 def __init__(self, attrs): """ 初始化用例 :param attrs:zip型別——>[{key,value},(key1,value1)......] """ for i in attrs: setattr(self, i[0], i[1])class ReadExcel(object): def __init__(self, filename, sheetname): """ 定義需要開啟的檔案及表名 :param filename: 檔名 :param sheetname: 表名 """ self.wb = openpyxl.load_workbook(filename) self.sheet = self.wb[sheetname] def read_data_obj_new(self, list2): # 獲取最大行數 max_r1 = self.sheet.max_row cases = [] # 用來存放表頭資料 titles = [] for row in range(1, max_r1 + 1): if row != 1: case_data = [] for column in list2: info = self.sheet.cell(row, column).value # print(info) case_data.append(info) case = list(zip(titles, case_data)) # 新建物件時,將物件傳給Case類 case_obj = Case(case) # print(case_obj.caseid,case_obj.excepted,case_obj.data) cases.append(case_obj) else: # 獲取表頭 for column in list2: title = self.sheet.cell(row, column).value titles.append(title) if None in titles: raise ValueError("傳入的表頭的資料有顯示為空") return casesif __name__ == '__main__': r = ReadExcel('cases.xlsx', 'Sheet1') res1 = r.read_data_obj_new([1, 2, 3]) for i in res1: print(i.caseid, i.data, i.excepted)
完整流程的程式碼
一、將測試資料引數化
import unittestfrom python.register_new.register import registerfrom python.register_new.register_testcase_new import RegisterTestCasefrom HTMLTestRunnerNew import HTMLTestRunnerclass RegisterTestCase(unittest.TestCase): # 初始化測試用例 def __init__(self,modethod_name,excepted,data): # modethod_name 測試用例方法名 super().__init__(modethod_name) # excepted 測試用例的預期結果 self.excepted = excepted # data 測試用例引數值 self.data = data def setUp(self): print("準備測試環境,執行測試用例之前會執行此操作") def tearDown(self): print("還原測試環境,執行完測試用例之後會執行此操作") def test_register(self): res = register(*self.data) try: self.assertEquals(self.excepted,res) except AssertionError as e: print("該條測試用例執行未通通過") raise e else: print("該條測試用例執行通過")# 建立測試套件suite = unittest.TestSuite()# 將測試用例新增至測試套件中case = [{'excepted':'{"code": 1, "msg": "註冊成功"}','data':'('python1', '123456','123456')'}, {'excepted':'{"code": 0, "msg": "兩次密碼不一致"}','data':'('python1', '1234567','123456')'}]for case in cases: suite.addTest(RegisterTestCase('test_register',case['excepted'],case['data']))# 執行測試套件,生成測試報告with open("report.html",'wb') as f: runner = HTMLTestRunner( stream = f, verbosity = 2, title = 'python_test_report', description = '這是一份測試報告', tester = 'WL' ) runner.run(suite)
二.將呼叫封裝好的Excel類的完整程式碼流程
import unittestfrom python.register_new.register import registerfrom python.register_new.register_testcase_new import RegisterTestCasefrom HTMLTestRunnerNew import HTMLTestRunnerfrom python.readexcel import ReadExcelclass RegisterTestCase(unittest.TestCase): # 初始化測試用例 def __init__(self, modethod_name, excepted, data): # modethod_name 測試用例方法名 super().__init__(modethod_name) # excepted 測試用例的預期結果 self.excepted = excepted # data 測試用例引數值 self.data = data def setUp(self): print("準備測試環境,執行測試用例之前會執行此操作") def tearDown(self): print("還原測試環境,執行完測試用例之後會執行此操作") def test_register(self): res = register(*self.data) try: self.assertEquals(self.excepted, res) except AssertionError as e: print("該條測試用例執行未通通過") raise e else: print("該條測試用例執行通過")# 建立測試套件suite = unittest.TestSuite()# 呼叫封裝好的讀取資料的Excel類,獲取測試資料r1 = ReadExcel('cases.xlsx', 'Sheet1')cases = r1.read_data_obj_new([2, 3])# 將測試用例新增至測試套件中for case in cases: # 需要使用eva()函式對except和data進行自動識別 suite.addTest(RegisterTestCase('test_register', eval(case.excepted), eval(case.data)))# 執行測試套件,生成測試報告with open("report.html", 'wb') as f: runner = HTMLTestRunner( stream=f, verbosity=2, title='python_test_report', description='這是一份測試報告', tester='WL') runner.run(suite)
微訊號:lost-fawn新浪微博:青衫已舊伊人猶在-掃碼關注我們-
戳“閱讀原文”我們一起變可愛