1. 程式人生 > 其它 >excel sheet限制_Python 處理Excel內的資料(案例介紹*3)

excel sheet限制_Python 處理Excel內的資料(案例介紹*3)

技術標籤:excel sheet限制

623559c5-ee2f-eb11-8da9-e4434bdf6706.png點選上方“藍字”關注我們瞭解更多精彩 633559c5-ee2f-eb11-8da9-e4434bdf6706.png案例一介紹

現在有一批電商產品跟當日銷量的資料,如下,總共有上萬筆的資料,現在需要統計每個品牌當日的銷售量,比如美寶蓮今天總共賣出了多少的商品,另外需要統計每個品牌下面的每個子品類當日銷售量(品類可分為口紅、睫毛膏、粉底等),比如卡姿蘭口紅賣了多少、眉筆賣了多少。

643559c5-ee2f-eb11-8da9-e4434bdf6706.png
首先是要做出關鍵字碼表,如下,這些是透過電商常用的產品稱呼和觀察發現的,需要對商品名稱有一定的瞭解,比如歐萊雅的潔面膏其實就是洗面奶

653559c5-ee2f-eb11-8da9-e4434bdf6706.png


後面就是建立一個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')
最後將輸出的結果做圖展示

683559c5-ee2f-eb11-8da9-e4434bdf6706.png

6a3559c5-ee2f-eb11-8da9-e4434bdf6706.png案例二介紹

在一個專案中我們需要對使用者的終端機器進行統計,可是介面傳回的資料如下圖,同樣是IPhone卻有上萬種寫法,除了IPhone外,其他的安卓手機像是華為、OPPO、VIVO、小米等都有類似的情況,現在需要將這些分散的資料識別出,並加以統計

6b3559c5-ee2f-eb11-8da9-e4434bdf6706.png

流程為:

1、用關鍵字對錶內的內容進行查詢,將包含關鍵字的行記錄。

2、將包含關鍵字行第二列的資料進行加成,並且統計

3、輸出到新的文件裡


首先我們需要先製作一個關鍵字碼表,如下圖,我們將4大安卓機外的安卓機合計到安卓裡面

6d3559c5-ee2f-eb11-8da9-e4434bdf6706.png

接著,用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作圖,就可以完成使用者資料統計

6e3559c5-ee2f-eb11-8da9-e4434bdf6706.png

6f3559c5-ee2f-eb11-8da9-e4434bdf6706.png 713559c5-ee2f-eb11-8da9-e4434bdf6706.png 6f3559c5-ee2f-eb11-8da9-e4434bdf6706.png 743559c5-ee2f-eb11-8da9-e4434bdf6706.png案例三介紹 763559c5-ee2f-eb11-8da9-e4434bdf6706.png

封裝一個讀取用例的excel類:用來實現讀取資料和寫入資料的功能

cases.xlsx的測試資料:

773559c5-ee2f-eb11-8da9-e4434bdf6706.png

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新浪微博:青衫已舊伊人猶在-掃碼關注我們- 783559c5-ee2f-eb11-8da9-e4434bdf6706.jpeg 7a3559c5-ee2f-eb11-8da9-e4434bdf6706.gif戳“閱讀原文”我們一起變可愛