如何使用python讀取Excel指定范圍并轉為數(shù)組
前言
最近需要讀取Excel中的內(nèi)容,然后進行后續(xù)操作,對于這塊知識,博主以前以為自己不會涉及到,但是現(xiàn)在一涉及到,第一步就錯了,搞了好久。真的心累。因此寫了這篇博客。
目的:
excel中存放著數(shù)據(jù),如果要進行計算及其它操作,首先就要進行讀取。
我們先來看一下python中能操作Excel的庫對比(一共九個庫):
可以發(fā)現(xiàn),還是挺多的
這里使用的是xlrd庫。
安裝
這里首先就是導入這個包,
pip install xlrd==1.2.0
xlrd包版本最好是1.2.0,因為筆者使用2.多版本的xlrd時,代碼出現(xiàn)了類似下面的報錯,也就是說xlrd版本太高會導致無法支持讀取xlsx后綴的excel。
xlrd.biffh.XLRDError: Excel xlsx file; not supported
大家可以去試試將excel另存,看看保存類型。
目前筆者使用的是Excel2019版本的,默認保存類型為xlsx。
如果你之前已經(jīng)安裝xlrd高版本或更低版本了,建議先卸載一下,重新安裝。
pip uninstall xlrd pip install xlrd==1.2.0
實例
初階
一個excel中有如上數(shù)據(jù),我們需要將其提取出來,方便python進行后續(xù)操作。
代碼如下:
def extract1(file,index=0): workbook = xlrd.open_workbook(file) worksheet = workbook.sheet_by_index(index) rows = worksheet.nrows all = [] for i in range(rows): a = worksheet.row_values(i)[:] all.append(a) print(all) cc = np.array(all) print(cc) return cc
file是文件的路徑及名稱,index就是當前sheet表的索引。 下圖就是具體的索引。
當然也可以根據(jù)sheet表的名稱。
如下面代碼第一行按照的是索引方式,第二行按照的是sheet名稱。大家可自行選擇
worksheet = workbook.sheet_by_index(0) worksheet = workbook.sheet_by_name("sheet1")
rows = worksheet.nrows
返回的是sheet表的行數(shù),ncols則是列數(shù)
all = [] for i in range(rows): a = worksheet.row_values(i)[:] all.append(a)
首先定義一個空列表,然后遍歷每行,將里面的數(shù)據(jù)寫入列表中,
row_values()
是用來返回給定行中單元格值的切片。
最后將其轉換成數(shù)組類型即可。(按要求來,大家也可以不換)
下圖是結果:
換個高級的寫法,用推導式寫(濃縮才是精華)
def extract(file,index=0): workbook = xlrd.open_workbook(file) worksheet = workbook.sheet_by_index(index) rows = worksheet.nrows c = tuple(worksheet.row_values(i)[:] for i in range(rows)) a = np.array(c) print(a) return a
代碼行數(shù)瞬間縮短了。
最好調用一下函數(shù)即可
file = r'C:\Users\knighthood\OneDrive\桌面\11.xlsx' extract1(file)
進階1
要求:假如我excel只要圖中框出來的區(qū)域。
以下為了看的較為簡便,我使用推導式的代碼
def confine_array(file,index=0): workbook = xlrd.open_workbook(file) worksheet = workbook.sheet_by_index(index) rows = worksheet.nrows c = tuple(worksheet.row_values(i)[1:] for i in range(1, rows)) a = np.array(c) print(a) return a
如上,可以發(fā)現(xiàn),代碼變化之處就下面這一行。
c = tuple(worksheet.row_values(i)[1:] for i in range(1, rows))
一步步講解:
①for i in range(1, rows)
首先對于后面的for循環(huán),i控制的就是獲取的行,更改其范圍就會更改獲取到的行、行數(shù)。
如果是上面說的(1,rows),則對應著獲取第二行到最后一行,(0表示第一行)
②worksheet.row_values(i)[1:]
最后的[1:](本來的代碼中是沒有或者是[:])表示的是i行的元素從第2列(個)獲取到最后一行(個)。
因此我們只需要更改這兩處就可以獲得不同的內(nèi)容矩陣(如下)。
def flexible_array(file,index=0,row=1,col=1): workbook = xlrd.open_workbook(file) worksheet = workbook.sheet_by_index(index) rows = worksheet.nrows c = tuple(worksheet.row_values(i)[col:] for i in range(row,rows)) a = np.array(c) print(a) return a
結果如下圖
進階2
要求:能不能更簡化一點,根據(jù)我從哪個位置要數(shù)據(jù),如第二行第二列開始,將這后面的數(shù)據(jù)進行讀取。每次這樣對來對去,容易出錯,還是根據(jù)行列開始計算比較方便。
這里為了防止行列一樣,我就多加了一列。
def flexible1_array(file,index=0,row=1,col=1): workbook = xlrd.open_workbook(file) worksheet = workbook.sheet_by_index(index) rows = worksheet.nrows c = tuple(worksheet.row_values(i)[col-1:] for i in range(row-1,rows)) a = np.array(c) print(a) return a
代碼也主要變化了這一行
c = tuple(worksheet.row_values(i)[col-1:] for i in range(row-1,rows))
這里筆者就不多解釋了。
現(xiàn)在就可以根據(jù)需要的起始單元格所在的行列進行選取所要的內(nèi)容。
進階3
要求:不需要最后一列
這里的話,筆者就設置了最后需要的行和列作為結束的讀取。
def flexible2_array(file,index=0,row=1,col=1,end_row=None,end_col=None): workbook = xlrd.open_workbook(file) worksheet = workbook.sheet_by_index(index) rows = worksheet.nrows if end_row is None: c = tuple(worksheet.row_values(i)[col-1:end_col] for i in range(row-1, rows)) else: c = tuple(worksheet.row_values(i)[col - 1:end_col] for i in range(row - 1, end_row)) a = np.array(c) print(a) return a
上述代碼意思是,如果不輸入結束的行和列,讀取到的是包含數(shù)據(jù)的行列,如果輸入了行和列(或者其中一個),就讀取相應的內(nèi)容。由于end_row放在range()函數(shù)中,因此需要加個if判斷。
結果如下:
此外,我還發(fā)現(xiàn),end_col由于放在[]中,可輸入負數(shù)(不懂的可以去看看python列表負索引)。
不過這里的-1,其實際是排除了最后一列,從你輸入的行列到,你輸入的結束行和倒數(shù)第二列。
有些人可能會覺得別扭(比如我,更喜歡-1表示從起始列到最后一列,-2表示從起始列到倒數(shù)第二列)
def flexible3_array(file,index=0,row=1,col=1,end_row=None,end_col=None): workbook = xlrd.open_workbook(file) worksheet = workbook.sheet_by_index(index) rows = worksheet.nrows if end_row is None: c = tuple(worksheet.row_values(i)[col-1:end_col if end_col > 0 else end_col+1] for i in range(row-1, rows)) else: c = tuple(worksheet.row_values(i)[col-1:end_col if end_col > 0 else end_col+1] for i in range(row - 1, end_row)) a = np.array(c) print(a) return a
這里,代碼中將判斷end_col是否為負,使用了if-else寫在一行。減少了很多代碼判斷量,使看起來更簡潔。
這里看個人喜好是否使用這個方法。
還有一個end_col參數(shù)使用負數(shù)的原因是,end_row由于在excel中對應的是行,其用的是數(shù)字表示,而excel中列用字母表示,因此如果當數(shù)據(jù)列數(shù)太多的時候(如下圖),去數(shù)列還是挺麻煩的
總結
上述內(nèi)容是一步一步進行修改添加的,對應著平時要求的逐漸添加,功能的逐漸完善。
筆者在上篇構建層次分析法,用到的數(shù)據(jù)矩陣,可以和這篇一起結合,通過excel讀取轉為數(shù)組,然后進行層次分析法的操作。
到此這篇關于如何使用python讀取Excel指定范圍并轉為數(shù)組的文章就介紹到這了,更多相關python讀取Excel并轉數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python用 KNN 進行驗證碼識別的實現(xiàn)方法
這篇文章主要介紹了Python用 KNN 進行驗證碼識別的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-02-02在Windows中設置Python環(huán)境變量的實例講解
下面小編就為大家分享一篇在Windows中設置Python環(huán)境變量的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04Python解決MySQL數(shù)據(jù)處理從SQL批量刪除報錯
這篇文章主要為大家介紹了Python解決MySQL數(shù)據(jù)處理從SQL批量刪除報錯,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12Python3.6 中的pyinstaller安裝和使用教程
這篇文章主要介紹了Python3.6 中的pyinstaller安裝和使用的教程,本文給大家介紹的非常詳細,對大家的工作或學習具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03