最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python利用openpyxl操作Excel表格的完整指南

 更新時(shí)間:2026年03月31日 09:09:53   作者:東眠的魚  
存測(cè)試數(shù)據(jù)有時(shí)候有大批量的數(shù)據(jù),存到TXT文件里面顯然不是最佳的方式,我們可以存到Excel里面去,下面我們就來看看如何使用Python自動(dòng)化操作Excel表格吧

一、openpyxl介紹安裝

為什么要學(xué)Excel

存測(cè)試數(shù)據(jù)

有時(shí)候有大批量的數(shù)據(jù),存到TXT文件里面顯然不是最佳的方式,我們可以存到Excel里面去,第一方便我們存數(shù)據(jù)和做數(shù)據(jù),另一方面方便我們讀取數(shù)據(jù),比較明朗。測(cè)試的時(shí)候就從數(shù)據(jù)庫(kù)中讀取出來,這點(diǎn)是非常重要的。

存測(cè)試結(jié)果

可以批量把結(jié)果存入到Excel中,也是比較好整理數(shù)據(jù)點(diǎn),比我們的TXT要好。

安裝openpyxl

python中與excel操作相關(guān)的模塊:

  • xlrd庫(kù):從excel中讀取數(shù)據(jù),支持xls、xlsx
  • xlwt庫(kù):對(duì)excel進(jìn)行修改操作,不支持對(duì)xlsx格式的修改
  • xlutils庫(kù):在xlw和xlrd中,對(duì)一個(gè)已存在的文件進(jìn)行修改。
  • openpyxl:主要針對(duì)xlsx格式的excel進(jìn)行讀取和編輯。

安裝方式:pip install openpyxl

Excel中的三大對(duì)象

  • WorkBook:工作簿對(duì)象
  • Sheet:表單對(duì)象
  • Cell:表格對(duì)象

二、openpyxl對(duì)Excel的操作

  • 創(chuàng)建一個(gè)工作薄:wb = openpyxl.Workbook()
  • 新增一個(gè)sheet表單:wb.create_sheet(‘test_case’)
  • 保存case.xlsx文件:wb.save(‘cases.xlsx’)
  • 打開工作簿:wb = openpyxl.load_workbook(‘cases.xlsx’)
  • 選取表單:sh = wb[‘Sheet1’
  • 讀取第一行、第一列的數(shù)據(jù):ce = sh.cell(row = 1,column = 1)
  • 按行讀取數(shù)據(jù):row_data = list(sh.rows)
  • 關(guān)閉工作?。簑b.close()
  • 按列讀取數(shù)據(jù):columns_data = list(sh.columns)
  • 寫入數(shù)據(jù)之前,該文件一定要處于關(guān)閉狀態(tài)
  • 寫入第一行、第四列的數(shù)據(jù) value = ‘result’:sh.cell(row = 1,column = 4,value = ‘result’)
  • 獲取最大行總數(shù)、最大列總數(shù):sh.max_row、sh.max_column
  • del 刪除表單的用法:del wb[‘sheet_name’]
  • remove 刪除表單的用法:sh = wb[‘sheet_name’] wb.remove(sh)
import openpyxl
# 創(chuàng)建一個(gè)工作簿
wb = openpyxl.Workbook()
# 創(chuàng)建一個(gè)test_case的sheet表單
wb.create_sheet('test_case')
# 保存為一個(gè)xlsx格式的文件
wb.save('cases.xlsx')
# 讀取excel中的數(shù)據(jù)
# 第一步:打開工作簿
wb = openpyxl.load_workbook('cases.xlsx')
# 第二步:選取表單
sh = wb['Sheet1']
# 第三步:讀取數(shù)據(jù)
# 參數(shù) row:行  column:列
ce = sh.cell(row = 1,column = 1)   # 讀取第一行,第一列的數(shù)據(jù)
print(ce.value)
# 按行讀取數(shù)據(jù) list(sh.rows)
print(list(sh.rows)[1:])     # 按行讀取數(shù)據(jù),去掉第一行的表頭信息數(shù)據(jù)
for cases in list(sh.rows)[1:]:
    case_id =  cases[0].value
    case_excepted = cases[1].value
    case_data = cases[2].value
    print(case_excepted,case_data)
# 關(guān)閉工作薄
wb.close()

三.封裝一個(gè)讀取用例的excel類:用來實(shí)現(xiàn)讀取數(shù)據(jù)和寫入數(shù)據(jù)的功能

cases.xlsx的測(cè)試數(shù)據(jù):

1.按行讀取數(shù)據(jù),存儲(chǔ)在列表中

import openpyxl
class Case: #這個(gè)類用來存儲(chǔ)用例的
    __slots__ = [] #特殊的類屬性,可以用來限制這個(gè)類創(chuàng)建的實(shí)例屬性添加 可寫可不寫
    pass

class ReadExcel(object): #讀取excel數(shù)據(jù)的類
    def __init__(self,file_name,sheet_name):
        """
        這個(gè)是用來初始化讀取對(duì)象的
        :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):
        #按行讀取數(shù)據(jù)轉(zhuǎn)化為列表
        rows_data = list(self.sh.rows)
        # print(rows_data)
        # 獲取表單的表頭信息
        titles = []
        for title in rows_data[0]:
            titles.append(title.value)
        # print(titles)
        #定義一個(gè)空列表用來存儲(chǔ)測(cè)試用例
        cases = []
        for case in rows_data[1:]:
            # print(case)
            data = []
            for cell in case: #獲取一條測(cè)試用例數(shù)據(jù)
                # 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)
                #將該條數(shù)據(jù)存放至cases中
            # print(dict(list(zip(titles,data))))
                case_data = dict(list(zip(titles,data)))
                cases.append(case_data)
        return cases
if __name__ == '__main__':
    r = ReadExcel('cases.xlsx','Sheet1')
    data1 = r.read_data_line()
    print(data1)

2.按行讀取數(shù)據(jù),存儲(chǔ)在對(duì)象中

import openpyxl
class Case:
    pass
class ReadExcel(object):
    def __init__(self,filename,sheetname):
        self.wb = openpyxl.load_workbook(filename)
        self.sh = self.wb[sheetname]
    def read_data_obj(self):
        """
        按行讀取數(shù)據(jù)  每條用例存儲(chǔ)在一個(gè)對(duì)象中
        :return:
        """
        rows_data = list(self.sh.rows)
        # print(rows_data)
        # 獲取表單的表頭信息
        titles = []
        for title in rows_data[0]:
            titles.append(title.value)
        # print(titles)
        # 定義一個(gè)空列表用來存儲(chǔ)測(cè)試用例
        cases = []
        for case in rows_data[1:]:
            # print(case)
            #創(chuàng)建一個(gè)Case類的對(duì)象,用來保存用例數(shù)據(jù)
            case_obj = Case()
            data = []
            for cell in case:  # 獲取一條測(cè)試用例數(shù)據(jù)
                # 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)
            # 將該條數(shù)據(jù)存放至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 cases
if  __name__ == '__main__':
    r = ReadExcel('cases.xlsx','Sheet1')
    res = r.read_data_obj()
    for i in res:
        print(i.caseid, i.excepted, i.data)

3.將測(cè)試用例封裝到列表中,讀取指定列的數(shù)據(jù)

import openpyxl
class Case:
    pass
class ReadExcelZy(object):
    def __init__(self,filename,sheetname):
        self.wb = openpyxl.load_workbook(filename)
        self.sheet = self.wb[sheetname]
        # list1 參數(shù)為一個(gè)列表,傳入的是指定讀取數(shù)據(jù)的列,比如[1,2,3]
        # 每一行[1,3,5]列的數(shù)據(jù),讀取出來就作為一條測(cè)試用例,放在字典中
        # 所有的用例放在列表中并且進(jìn)行返回
    def read_data(self,list1):
        """
        :param list1:  list--->要讀取列   list類型
        :return:    返回一個(gè)列表,每一個(gè)元素為一個(gè)用例(用例為dict類型)
        """
        # 獲取最大的行數(shù)
        max_r = self.sheet.max_row
        cases = []   #定義一個(gè)空列表,用來存放所有的用例數(shù)據(jù)
        titles = []   #定義一個(gè)空列表,用來存放表頭
        # 遍歷所有的行數(shù)據(jù)
        for row in range(1,max_r+1):
            if row != 1:      #判斷是否是第一行
                case_data = [] #定義一個(gè)空列表,用來存放該行的用例數(shù)據(jù)
                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))  #將該條數(shù)據(jù)和表頭進(jìn)行打包組合,作用相當(dāng)于dict(list(zip(titles,case_data)))
                # print(case)
                cases.append(case)
                # print(cases)
            else:   #獲取表頭數(shù)據(jù)
                for column in list1:
                    title = self.sheet.cell(row,column).value
                    titles.append(title)
                # print(titles)
        return cases
if __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.將測(cè)試用例封裝到對(duì)象中,讀取指定列的數(shù)據(jù)

import openpyxl
class Case:
    pass
class ReadExcelZy(object):
    def __init__(self,filename,sheetname):
        self.wb = openpyxl.load_workbook(filename)
        self.sheet = self.wb[sheetname]

        # list1 參數(shù)為一個(gè)列表,傳入的是指定讀取數(shù)據(jù)的列,比如[1,2,3]
        # 每一行[1,3,5]列的數(shù)據(jù),讀取出來就作為一條測(cè)試用例,放在字典中
        # 所有的用例放在對(duì)象中并且進(jìn)行返回
    def read_data_obj(self,list2):
        max_r1 = self.sheet.max_row      #獲取最大行數(shù)
        cases = []
        titles = []      #用來存放表頭數(shù)據(jù)
        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))
                #將一條用例存到一個(gè)對(duì)象中(每一列對(duì)應(yīng)對(duì)象的一個(gè)屬性)
                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 cases
if __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.優(yōu)化第4部分代碼,將設(shè)置對(duì)象屬性寫在初始化方法中(封裝Excel類讀取數(shù)據(jù)最常用的方法)

import openpyxl
class Case:  # 這個(gè)類用來存儲(chǔ)用例的
    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):
        # 獲取最大行數(shù)
        max_r1 = self.sheet.max_row
        cases = []
        # 用來存放表頭數(shù)據(jù)
        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))
                # 新建對(duì)象時(shí),將對(duì)象傳給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("傳入的表頭的數(shù)據(jù)有顯示為空")
        return cases
if __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)

三.完整流程的代碼

將測(cè)試數(shù)據(jù)參數(shù)化

import unittest
from python.register_new.register import register
from python.register_new.register_testcase_new import RegisterTestCase
from HTMLTestRunnerNew import HTMLTestRunner
class RegisterTestCase(unittest.TestCase):
    # 初始化測(cè)試用例
    def __init__(self,modethod_name,excepted,data):
        # modethod_name 測(cè)試用例方法名
        super().__init__(modethod_name)
        # excepted 測(cè)試用例的預(yù)期結(jié)果
        self.excepted = excepted
        # data 測(cè)試用例參數(shù)值
        self.data = data

    def setUp(self):
        print("準(zhǔn)備測(cè)試環(huán)境,執(zhí)行測(cè)試用例之前會(huì)執(zhí)行此操作")

    def tearDown(self):
        print("還原測(cè)試環(huán)境,執(zhí)行完測(cè)試用例之后會(huì)執(zhí)行此操作")

    def test_register(self):
        res = register(*self.data)
        try:
            self.assertEquals(self.excepted,res)
        except AssertionError as e:
            print("該條測(cè)試用例執(zhí)行未通通過")
            raise e
        else:
            print("該條測(cè)試用例執(zhí)行通過")

# 創(chuàng)建測(cè)試套件
suite = unittest.TestSuite()

# 將測(cè)試用例添加至測(cè)試套件中
case = [{'excepted':'{"code": 1, "msg": "注冊(cè)成功"}','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']))

# 執(zhí)行測(cè)試套件,生成測(cè)試報(bào)告
with open("report.html",'wb') as f:
    runner = HTMLTestRunner(
        stream = f,
        verbosity = 2,
        title = 'python_test_report',
        description = '這是一份測(cè)試報(bào)告',
        tester = 'WL'
    )
    runner.run(suite)

將調(diào)用封裝好的Excel類的完整代碼流程

import unittest
from python.register_new.register import register
from python.register_new.register_testcase_new import RegisterTestCase
from HTMLTestRunnerNew import HTMLTestRunner
from python.readexcel import ReadExcel


class RegisterTestCase(unittest.TestCase):
    # 初始化測(cè)試用例
    def __init__(self, modethod_name, excepted, data):
        # modethod_name 測(cè)試用例方法名
        super().__init__(modethod_name)
        # excepted 測(cè)試用例的預(yù)期結(jié)果
        self.excepted = excepted
        # data 測(cè)試用例參數(shù)值
        self.data = data

    def setUp(self):
        print("準(zhǔn)備測(cè)試環(huán)境,執(zhí)行測(cè)試用例之前會(huì)執(zhí)行此操作")

    def tearDown(self):
        print("還原測(cè)試環(huán)境,執(zhí)行完測(cè)試用例之后會(huì)執(zhí)行此操作")

    def test_register(self):
        res = register(*self.data)
        try:
            self.assertEquals(self.excepted, res)
        except AssertionError as e:
            print("該條測(cè)試用例執(zhí)行未通通過")
            raise e
        else:
            print("該條測(cè)試用例執(zhí)行通過")


# 創(chuàng)建測(cè)試套件
suite = unittest.TestSuite()
# 調(diào)用封裝好的讀取數(shù)據(jù)的Excel類,獲取測(cè)試數(shù)據(jù)
r1 = ReadExcel('cases.xlsx', 'Sheet1')
cases = r1.read_data_obj_new([2, 3])
# 將測(cè)試用例添加至測(cè)試套件中
for case in cases:
    # 需要使用eval()函數(shù)對(duì)except和data進(jìn)行自動(dòng)識(shí)別
    suite.addTest(RegisterTestCase('test_register', eval(case.excepted), eval(case.data)))
# 執(zhí)行測(cè)試套件,生成測(cè)試報(bào)告
with open("report.html", 'wb') as f:
    runner = HTMLTestRunner(
        stream=f,
        verbosity=2,
        title='python_test_report',
        description='這是一份測(cè)試報(bào)告',
        tester='WL')
    runner.run(suite)

以上就是Python利用openpyxl操作Excel表格的完整指南的詳細(xì)內(nèi)容,更多關(guān)于Python操作Excel表格的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 快速進(jìn)修Python指南之文件操作

    快速進(jìn)修Python指南之文件操作

    這篇文章主要為大家介紹了Java開發(fā)者快速進(jìn)修Python指南之文件操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Pandas中Series的屬性,方法,常用操作使用案例

    Pandas中Series的屬性,方法,常用操作使用案例

    這篇文章主要介紹了Pandas中Series的屬性,方法,常用操作使用案例,文章通過包的引入展開主題,需要的朋友可以參考一下
    2022-07-07
  • Python列表(list)所有元素的同一操作解析

    Python列表(list)所有元素的同一操作解析

    這篇文章主要介紹了Python列表(list)所有元素的同一操作解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Django drf請(qǐng)求模塊源碼解析

    Django drf請(qǐng)求模塊源碼解析

    APIView中的dispatch是整個(gè)請(qǐng)求生命過程的核心方法,包含了請(qǐng)求模塊,權(quán)限驗(yàn)證,異常模塊和響應(yīng)模塊,我們先來介紹請(qǐng)求模塊,對(duì)Django drf請(qǐng)求模塊源碼相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-06-06
  • Python中l(wèi)ogger模塊的使用場(chǎng)景分析

    Python中l(wèi)ogger模塊的使用場(chǎng)景分析

    logger是python的內(nèi)置模塊,用以輸出代碼運(yùn)行過程中的運(yùn)行情況,極大的方便了我們的debug過程,本文通過實(shí)例代碼給大家介紹了Python中l(wèi)ogger模塊的使用教程,需要的朋友可以參考下
    2023-06-06
  • 使用Python的SymPy庫(kù)解決數(shù)學(xué)運(yùn)算問題的方法

    使用Python的SymPy庫(kù)解決數(shù)學(xué)運(yùn)算問題的方法

    這篇文章主要介紹了使用Python的SymPy庫(kù)解決數(shù)學(xué)運(yùn)算問題的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-03-03
  • Python使用PIL構(gòu)建圖片裁剪工具的實(shí)現(xiàn)步驟

    Python使用PIL構(gòu)建圖片裁剪工具的實(shí)現(xiàn)步驟

    這篇博客將為您展示如何使用 wxPython 和 PIL 庫(kù)開發(fā)一個(gè)圖片裁剪工具,本工具能夠加載圖片,允許用戶通過拖拽選擇框裁剪圖片,并保存裁剪后的結(jié)果,以下是完整代碼和實(shí)現(xiàn)步驟,需要的朋友可以參考下
    2025-01-01
  • Tornado服務(wù)器中綁定域名、虛擬主機(jī)的方法

    Tornado服務(wù)器中綁定域名、虛擬主機(jī)的方法

    這篇文章主要介紹了Tornado服務(wù)器中綁定域名、虛擬主機(jī)的方法,本人查看了Tornado才得的方法,特此分享,需要的朋友可以參考下
    2014-08-08
  • Python中的groupby分組功能的實(shí)例代碼

    Python中的groupby分組功能的實(shí)例代碼

    這篇文章主要介紹了Python中的groupby分組功能的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-07-07
  • Django前端BootCSS實(shí)現(xiàn)分頁(yè)的方法

    Django前端BootCSS實(shí)現(xiàn)分頁(yè)的方法

    本文主要介紹了Django前端BootCSS實(shí)現(xiàn)分頁(yè)的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評(píng)論

峨边| 太白县| 抚州市| 巴里| 莲花县| 江油市| 额敏县| 岑巩县| 得荣县| 丹东市| 彭山县| 平果县| 类乌齐县| 罗平县| 徐州市| 依安县| 涿鹿县| 南城县| 扶绥县| 武功县| 伽师县| 礼泉县| 镇康县| 洛南县| 星座| 射阳县| 岳阳县| 红原县| 贵定县| 鄱阳县| 长沙市| 秦安县| 扎兰屯市| 岗巴县| 茌平县| 全南县| 新兴县| 孝昌县| 桐梓县| 麻江县| 灌南县|