Python操作Excel數(shù)據(jù)的封裝函數(shù)分享
對(duì)比其它編程語(yǔ)言,我們都知道Python最大的優(yōu)勢(shì)是代碼簡(jiǎn)單,有豐富的第三方開(kāi)源庫(kù)供開(kāi)發(fā)者使用。伴隨著近幾年數(shù)據(jù)分析的熱度,Python也成為最受歡迎的編程語(yǔ)言之一。而對(duì)于數(shù)據(jù)的讀取和存儲(chǔ),對(duì)于普通人來(lái)講,除了數(shù)據(jù)庫(kù)之外,最常見(jiàn)的就是微軟的Excel。
1. 前期準(zhǔn)備
1.1. 初識(shí)Excel
Microsoft Excel是Microsoft為使用Windows和Apple Macintosh操作系統(tǒng)的電腦編寫的一款電子表格軟件。
1.2. 格式區(qū)別
Excel中有xls和xlsx兩種格式,它們之間的區(qū)別是:
- 文件格式不同。xls是一個(gè)特有的二進(jìn)制格式,其核心結(jié)構(gòu)是復(fù)合文檔類型的結(jié)構(gòu),而xlsx的核心結(jié)構(gòu)是XML類型的結(jié)構(gòu),采用的是基于 XML的壓縮方式,使其占用的空間更小。xlsx 中最后一個(gè) x 的意義就在于此。
- 版本不同。xls是Excel2003及以前版本生成的文件格式,而xlsx是Excel2007及以后版本生成的文件格式。
- 兼容性不同。xlsx格式是向下兼容的,可兼容xls格式。
1.3. 庫(kù)的使用
Python自帶的模塊中有針對(duì)xls格式的xlrd和xlwt模塊,但這兩個(gè)庫(kù)僅僅是針對(duì)xls的操作,當(dāng)我們要操作xlsx格式文件時(shí),則需要使用到openpyxl第三方庫(kù)。
1.4. 整體思路
當(dāng)使用以上幾個(gè)模塊的時(shí)候,從理論上我們就可以完全操作不同格式的Excel的讀和寫,很多人就疑惑,那這篇文章的作用是什么?我們直接學(xué)習(xí)對(duì)應(yīng)的這三個(gè)模塊不就好了嗎?
答案就是:雖然這幾個(gè)庫(kù)已經(jīng)把Excel的文件、表、行、列的概念完全轉(zhuǎn)換為Python中的對(duì)象,但每次操作都需要遍歷每一個(gè)單元格,甚至很多時(shí)候我們要花費(fèi)大量的時(shí)間在思考循環(huán)單元格的邊界上,這本身就是在重復(fù)造輪子,因此我花了半天時(shí)間整理了以下六個(gè)函數(shù)。
2. 代碼展示
2.1. xlz格式
2.1.1. 讀取xls格式文件
def?read_xls_excel(url,index): ????''' ????讀取xls格式文件 ????參數(shù): ????????url:文件路徑 ??????? index:工作表序號(hào)(第幾個(gè)工作表,傳入?yún)?shù)從1開(kāi)始數(shù)) ????返回: ????????data:表格中的數(shù)據(jù) ????''' ????#?打開(kāi)指定的工作簿 ????workbook?=?xlrd.open_workbook(url) ????#?獲取工作簿中的所有表格 ????sheets?=?workbook.sheet_names() ????#?獲取工作簿中所有表格中的的第?index?個(gè)表格 ????worksheet?=?workbook.sheet_by_name(sheets[index-1]) ????#?定義列表存儲(chǔ)表格數(shù)據(jù) ????data?=?[] ????#?遍歷每一行數(shù)據(jù) ????for?i?in?range(0,?worksheet.nrows): ????????#?定義表格存儲(chǔ)每一行數(shù)據(jù) ????????da?=?[] ????????#?遍歷每一列數(shù)據(jù) ????????for?j?in?range(0,?worksheet.ncols): ????????????#?將行數(shù)據(jù)存儲(chǔ)到da列表 ????????????da.append(worksheet.cell_value(i,?j)) ????????#?存儲(chǔ)每一行數(shù)據(jù) ????????data.append(da) ????#?返回?cái)?shù)據(jù) ????return?data
2.1.2. 寫入xls格式文件
def?write_xls_excel(url,sheet_name,two_dimensional_data): ??''' ????寫入xls格式文件 ????參數(shù): ????????url:文件路徑 ????????sheet_name:表名 ??????? two_dimensional_data:將要寫入表格的數(shù)據(jù)(二維列表) ????''' ????#?創(chuàng)建工作簿對(duì)象 ????workbook?=?xlwt.Workbook() ????#?創(chuàng)建工作表對(duì)象 ????sheet?=?workbook.add_sheet(sheet_name) ????#?遍歷每一行數(shù)據(jù) ????for?i?in?range(0,len(two_dimensional_data)): ????????#?遍歷每一列數(shù)據(jù) ????????for?j?in?range(0,len(two_dimensional_data[i])): ????????????#?寫入數(shù)據(jù) ????????????sheet.write(i,j,two_dimensional_data[i][j]) ????#?保存 ????workbook.save(url) ????print("寫入成功")
2.1.3. 追加寫入xls格式文件
def?write_xls_excel_add(url,?two_dimensional_data,?index): ????''' ????追加寫入xls格式文件 ????參數(shù): ????????url:文件路徑 ??????? two_dimensional_data:將要寫入表格的數(shù)據(jù)(二維列表) ??????? index:指定要追加的表的序號(hào)(第幾個(gè)工作表,傳入?yún)?shù)從1開(kāi)始數(shù)) ????''' ????#?打開(kāi)指定的工作簿 ????workbook?=?xlrd.open_workbook(url) ????#?獲取工作簿中的所有表格 ????sheets?=?workbook.sheet_names() ????#?獲取指定的表 ????worksheet?=?workbook.sheet_by_name(sheets[index-1]) ????#?獲取表格中已存在的數(shù)據(jù)的行數(shù) ????rows_old?=?worksheet.nrows ????#?將xlrd對(duì)象拷貝轉(zhuǎn)化為xlwt對(duì)象 ????new_workbook?=?copy(workbook) ????#?獲取轉(zhuǎn)化后工作簿中的第index個(gè)表格 ????new_worksheet?=?new_workbook.get_sheet(index-1) ????#?遍歷每一行數(shù)據(jù) ????for?i?in?range(0,?len(two_dimensional_data)): ????????#?遍歷每一列數(shù)據(jù) ????????for?j?in?range(0,?len(two_dimensional_data[i])): ????????????#?追加寫入數(shù)據(jù),注意是從i+rows_old行開(kāi)始寫入 ????????????new_worksheet.write(i+rows_old,?j,?two_dimensional_data[i][j]) ????#?保存工作簿 ????new_workbook.save(url) ????print("追加寫入成功")
2.2. xlsx格式
2.2.1. 讀取xlsx格式文件
def?read_xlsx_excel(url,?sheet_name): ????''' ????讀取xlsx格式文件 ????參數(shù): ????????url:文件路徑 ????????sheet_name:表名 ????返回: ????????data:表格中的數(shù)據(jù) ????''' ????#?使用openpyxl加載指定路徑的Excel文件并得到對(duì)應(yīng)的workbook對(duì)象 ????workbook?=?openpyxl.load_workbook(url) ????#?根據(jù)指定表名獲取表格并得到對(duì)應(yīng)的sheet對(duì)象 ????sheet?=?workbook[sheet_name] ????#?定義列表存儲(chǔ)表格數(shù)據(jù) ????data?=?[] ????#?遍歷表格的每一行 ????for?row?in?sheet.rows: ????????#?定義表格存儲(chǔ)每一行數(shù)據(jù) ????????da?=?[] ????????#?從每一行中遍歷每一個(gè)單元格 ????????for?cell?in?row: ????????????#?將行數(shù)據(jù)存儲(chǔ)到da列表 ????????????da.append(cell.value) ????????#?存儲(chǔ)每一行數(shù)據(jù) ????????data.append(da) ????#?返回?cái)?shù)據(jù) ????return?data
2.2.2. 寫入xlsx格式文件
def?write_xlsx_excel(url,?sheet_name,?two_dimensional_data): ????''' ????寫入xlsx格式文件 ????參數(shù): ????????url:文件路徑 ????????sheet_name:表名 ??????? two_dimensional_data:將要寫入表格的數(shù)據(jù)(二維列表) ????''' ????#?創(chuàng)建工作簿對(duì)象 ????workbook?=?openpyxl.Workbook() ????#?創(chuàng)建工作表對(duì)象 ????sheet?=?workbook.active ????#?設(shè)置該工作表的名字 ????sheet.title?=?sheet_name ????#?遍歷表格的每一行 ????for?i?in?range(0,?len(two_dimensional_data)): ????????#?遍歷表格的每一列 ????????for?j?in?range(0,?len(two_dimensional_data[i])): ????????????#?寫入數(shù)據(jù)(注意openpyxl的行和列是從1開(kāi)始的,和我們平時(shí)的認(rèn)知是一樣的) ????????????sheet.cell(row=i?+?1,?column=j?+?1,?value=str(two_dimensional_data[i][j])) ????#?保存到指定位置 ????workbook.save(url) ????print("寫入成功")
2.2.3. 追加寫入xlsx格式文件
def?write_xlsx_excel_add(url,?sheet_name,?two_dimensional_data): ????''' ????追加寫入xlsx格式文件 ????參數(shù): ????????url:文件路徑 ????????sheet_name:表名 ??????? two_dimensional_data:將要寫入表格的數(shù)據(jù)(二維列表) ????''' ????#?使用openpyxl加載指定路徑的Excel文件并得到對(duì)應(yīng)的workbook對(duì)象 ????workbook?=?openpyxl.load_workbook(url) ????#?根據(jù)指定表名獲取表格并得到對(duì)應(yīng)的sheet對(duì)象 ????sheet?=?workbook[sheet_name] ????for?tdd?in?two_dimensional_data: ????????sheet.append(tdd) ????#?保存到指定位置 ????workbook.save(url) ????print("追加寫入成功")
3. 結(jié)果測(cè)試
3.1. 讀取測(cè)試
先準(zhǔn)備兩個(gè)Excel文件,如圖所示
其內(nèi)容如下:
測(cè)試代碼:
data1=read_xlsx_excel(r'D:\ii\aa.xlsx',"Sheet1") data2=read_xlsx_excel(r'D:\ii\bb.xls',1) for da in data1: print(da) print("------------") for da2 in data1: print(da2)
輸出結(jié)果:
結(jié)論:表明讀取并沒(méi)有問(wèn)題?。?!接下來(lái)測(cè)試寫入
3.2. 寫入測(cè)試
測(cè)試代碼:
uio=[[1,"adsf"],[5,3],[5,"你好"]] iuo=[[1,2],["adf",3],[5,"你好"]] wirte_xlsx_excel(r'D:\ii\aa.xlsx',"Sheet1",uio) wirte_xlsx_excel(r'D:\ii\bb.xls',"Sheet1",iuo)
結(jié)果輸出:
看到數(shù)據(jù)被覆蓋了?。。〗酉聛?lái)在上面修改后的數(shù)據(jù)的基礎(chǔ)上測(cè)試追加寫入
3.3. 追加寫入測(cè)試
測(cè)試代碼:
li=[[1,"add"],[1,"加入"]] write_xlsx_excel_add(r'D:\ii\bb.xls',li,1) kk=[[1,"woshilie"],[4,"列"]] write_xlsx_excel_add(r'D:\ii\aa.xlsx',"Sheet1",kk)
結(jié)果輸出:
追加也沒(méi)有問(wèn)題?。?/p>
4. 總結(jié)
我們一直認(rèn)為數(shù)據(jù)分析就應(yīng)該以數(shù)據(jù)為主,而不應(yīng)該把大量的代碼花費(fèi)在設(shè)計(jì)Excel表格的樣式上,這樣多少就有點(diǎn)主客顛倒的意思了。
到此這篇關(guān)于Python操作Excel數(shù)據(jù)的封裝函數(shù)分享的文章就介紹到這了,更多相關(guān)Python操作Excel數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python selenium 獲取接口數(shù)據(jù)的實(shí)現(xiàn)
這篇文章主要介紹了python selenium 獲取接口數(shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Python+tkinter實(shí)現(xiàn)樹(shù)形圖繪制
Treeview是ttk中的樹(shù)形表組件,功能十分強(qiáng)大,非常適用于系統(tǒng)路徑的表達(dá),下面我們就來(lái)看看如何利用這一組件實(shí)現(xiàn)樹(shù)形圖的繪制吧,有需要的可以參考下2023-09-09一篇教程教你學(xué)會(huì)Python進(jìn)制轉(zhuǎn)換(十進(jìn)制轉(zhuǎn)二進(jìn)制、八進(jìn)制、十六進(jìn)制)
計(jì)算機(jī)中只有1和0,所以就導(dǎo)致很多時(shí)候需要進(jìn)制轉(zhuǎn)換,本文介紹了Python進(jìn)制轉(zhuǎn)換,十進(jìn)制轉(zhuǎn)二進(jìn)制,十進(jìn)制轉(zhuǎn)八進(jìn)制,十進(jìn)制轉(zhuǎn)十六進(jìn)制,有興趣的可以了解一下2021-05-05python獲取list下標(biāo)及其值的簡(jiǎn)單方法
下面小編就為大家?guī)?lái)一篇python獲取list下標(biāo)及其值的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09PyCharm配置KBEngine快速處理代碼提示沖突、配置命令問(wèn)題
這篇文章主要介紹了PyCharm配置KBEngine,解決代碼提示沖突、配置命令,本文通過(guò)圖文并茂的形式給大家介紹的超詳細(xì),需要的朋友可以參考下2021-04-04使用Python通過(guò)win32 COM實(shí)現(xiàn)Word文檔的寫入與保存方法
今天小編就為大家分享一篇使用Python通過(guò)win32 COM實(shí)現(xiàn)Word文檔的寫入與保存方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05python 實(shí)現(xiàn)單一數(shù)字取對(duì)數(shù)與數(shù)列取對(duì)數(shù)
這篇文章主要介紹了python 實(shí)現(xiàn)單一數(shù)字取對(duì)數(shù)與數(shù)列取對(duì)數(shù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2021-05-05Python+Sympy實(shí)現(xiàn)計(jì)算微積分
微積分的計(jì)算也許平時(shí)用不到,會(huì)讓人覺(jué)得有點(diǎn)高深,它們的計(jì)算過(guò)程中需要使用很多計(jì)算規(guī)則,但是使用?Sympy?可以有效減輕這方面的負(fù)擔(dān),本文就來(lái)和大家簡(jiǎn)單講講吧2023-07-07