<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近需要讀取Excel中的內容,然後進行後續操作,對於這塊知識,博主以前以為自己不會涉及到,但是現在一涉及到,第一步就錯了,搞了好久。真的心累。因此寫了這篇部落格。
excel中存放著資料,如果要進行計算及其它操作,首先就要進行讀取。
我們先來看一下python中能操作Excel的庫對比(一共九個庫):
可以發現,還是挺多的
這裡使用的是xlrd庫。
這裡首先就是匯入這個包,
pip install xlrd==1.2.0
xlrd包版本最好是1.2.0,因為筆者使用2.多版本的xlrd時,程式碼出現了類似下面的報錯,也就是說xlrd版本太高會導致無法支援讀取xlsx字尾的excel。
xlrd.biffh.XLRDError: Excel xlsx file; not supported
大家可以去試試將excel另存,看看儲存型別。
目前筆者使用的是Excel2019版本的,預設儲存型別為xlsx。
如果你之前已經安裝xlrd高版本或更低版本了,建議先解除安裝一下,重新安裝。
pip uninstall xlrd pip install xlrd==1.2.0
範例
一個excel中有如上資料,我們需要將其提取出來,方便python進行後續操作。
程式碼如下:
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表的索引。 下圖就是具體的索引。
當然也可以根據sheet表的名稱。
如下面程式碼第一行按照的是索引方式,第二行按照的是sheet名稱。大家可自行選擇
worksheet = workbook.sheet_by_index(0) worksheet = workbook.sheet_by_name("sheet1")
rows = worksheet.nrows
返回的是sheet表的行數,ncols則是列數
all = [] for i in range(rows): a = worksheet.row_values(i)[:] all.append(a)
首先定義一個空列表,然後遍歷每行,將裡面的資料寫入列表中,
row_values()
是用來返回給定行中單元格值的切片。
最後將其轉換成陣列型別即可。(按要求來,大家也可以不換)
下圖是結果:
換個高階的寫法,用推導式寫(濃縮才是精華)
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
程式碼行數瞬間縮短了。
最好呼叫一下函數即可
file = r'C:UsersknighthoodOneDrive桌面11.xlsx' extract1(file)
要求:假如我excel只要圖中框出來的區域。
以下為了看的較為簡便,我使用推導式的程式碼
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
如上,可以發現,程式碼變化之處就下面這一行。
c = tuple(worksheet.row_values(i)[1:] for i in range(1, rows))
一步步講解:
①for i in range(1, rows)
首先對於後面的for迴圈,i控制的就是獲取的行,更改其範圍就會更改獲取到的行、行數。
如果是上面說的(1,rows),則對應著獲取第二行到最後一行,(0表示第一行)
②worksheet.row_values(i)[1:]
最後的[1:](本來的程式碼中是沒有或者是[:])表示的是i行的元素從第2列(個)獲取到最後一行(個)。
因此我們只需要更改這兩處就可以獲得不同的內容矩陣(如下)。
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
結果如下圖
要求:能不能更簡化一點,根據我從哪個位置要資料,如第二行第二列開始,將這後面的資料進行讀取。每次這樣對來對去,容易出錯,還是根據行列開始計算比較方便。
這裡為了防止行列一樣,我就多加了一列。
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))
這裡筆者就不多解釋了。
現在就可以根據需要的起始單元格所在的行列進行選取所要的內容。
要求:不需要最後一列
這裡的話,筆者就設定了最後需要的行和列作為結束的讀取。
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
上述程式碼意思是,如果不輸入結束的行和列,讀取到的是包含資料的行列,如果輸入了行和列(或者其中一個),就讀取相應的內容。由於end_row放在range()函數中,因此需要加個if判斷。
結果如下:
此外,我還發現,end_col由於放在[]中,可輸入負數(不懂的可以去看看python列表負索引)。
不過這裡的-1,其實際是排除了最後一列,從你輸入的行列到,你輸入的結束行和倒數第二列。
有些人可能會覺得彆扭(比如我,更喜歡-1表示從起始列到最後一列,-2表示從起始列到倒數第二列)
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引數使用負數的原因是,end_row由於在excel中對應的是行,其用的是數位表示,而excel中列用字母表示,因此如果當資料列數太多的時候(如下圖),去數列還是挺麻煩的
上述內容是一步一步進行修改新增的,對應著平時要求的逐漸新增,功能的逐漸完善。
筆者在上篇構建層次分析法,用到的資料矩陣,可以和這篇一起結合,通過excel讀取轉為陣列,然後進行層次分析法的操作。
到此這篇關於如何使用python讀取Excel指定範圍並轉為陣列的文章就介紹到這了,更多相關python讀取Excel並轉陣列內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45