您好,登錄后才能下訂單哦!
說在前頭
最近在做畢設,題目是道路擁堵預測系統,學長建議我使用SVM算法進行預測,但是在此之前需要把Excel中的數據進行二次處理,原始數據不滿足我的需要,可是。。有346469條數據,不能每一條都自己進行運算并且將它進行歸一化運算!!
作為一個Java開發者,Python的使用我是從來沒用過的啊,也是作死選了個這么難的題目。。后來在網上查閱發現xlrd可以通過Python代碼讀取Excel的文件,他的含義是xls文件的read(只讀),另外它的同類是xlwt(xls的write嘍~),這個是可以執行寫入操作的庫。那我們就開始:
作為一名新手,Python的dalao千萬別噴,我們抱著學習的心態一起來學習這兩個庫到底怎么使用吧!
一、xlrd的使用
篇幅太多,這篇只介紹xlrd的使用,xlwt下篇繼續哦~
想使用肯定先安裝,windows系統下如果你安裝了Python環境,直接打開cmd鍵入:$ pip install xlrd
xlwt 也是這樣安裝,說實話Python這些個類庫真的是太方便了(題外話)
我們比如要修改這個Excel的數據:
總共有兩層:
導入xlrd
import xlrd
讀取數據文件
workbook = xlrd.open_workbook(r'E:\test.xlsx')
打印Sheet信息
print(workbook.sheet_names())
打印結果:
根據下標獲取表單
print(workbook.sheet_names()[1])
后面加個中括號,里面是表單的位置,我輸入1,表示第二頁,所以打印:
根據索引或名稱獲取數據的名稱、行或列
index = workbook.sheet_by_index(0)# 根據索引或者行數列數和名稱 print('索引名稱:'+str(index.name)+' 索引的行數'+ str(index.nrows)+' 索引的列數'+str(index.ncols))
輸出結果:
確實是七行五列,沒毛病~
同樣根據表單的名稱也能拿到Sheet對象
index2 = workbook.sheet_by_name('Sheet1') print('索引名稱:'+str(index2.name)+' 索引的行數'+ str(index2.nrows)+' 索引的列數'+str(index2.ncols))
輸出結果:
獲取整行整列的內容
最重要的來了,怎么獲取一整行、一整列的內容呢?
首先要拿到表單的對象,通過上面說的兩種方法:
我習慣用名稱獲取:
sheet1= workbook.sheet_by_name('Sheet1')
獲取了以后:
row_values = sheet1.row_values(2) print('第三行的內容:'+str(row_values)) col_values = sheet1.col_values(2) print('第三列的內容'+str(col_values))
我們看看輸出結果:
至于時間為什么是43812.0,這個是天數,可以轉換成日期格式,后邊我會詳細寫用法~
百分百沒毛病的!~
獲取具體幾行幾列的內容
這個方法有很多,都可以用,看個人習慣,我列舉六種:
print(sheet1.cell_value(1, 1)) print(sheet1.cell(1, 1)) print(sheet1.row(1)[1]) print(sheet1.col(1)[1]) print(sheet1.row_values(1)[1]) print(sheet1.col_values(1)[1])
想知道某行某列的類型是什么怎么做呢?
print(sheet1.cell(1, 0).ctype) print(sheet1.cell(1, 2).ctype) print(sheet1.cell(1, 3).ctype)
輸出結果為:
1
2
3
ctype 分別: 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
tip: 打印的時候需要注意:
python跟java在類型轉換上有很大的不同,這點我更喜歡Java的處理方式(打印的時候通通轉換成String類型),比如我想打印很多類型的屬性,同時打印沒問題,但是Python必須要限定類型為str,否則就會報錯
public class test { public static void main(String[] args) { int num = 1; String ss = "sss"; System.out.println("Integer"+num+"String"+ss); } }
java完全可以正常運行~
Python:
a = 1 b = 'ss' print('int:'+a+'str'+ b)
拼接的時候必須限定a和b為str類型,否則報錯!
報錯內容:
如何修改date類型為float類型的數字
想修改時間格式的屬性:
as_tuple = xlrd.xldate_as_tuple(sheet1.cell_value(1, 3), workbook.datemode)
cell_value(1,3) 表示我要獲取 2019/11/13
第二個參數datemode就不解釋了,需要改哪個文件,就調用哪個文件對象的datemode
我們輸出一下as_tuple這個對象:
看到這個元組里的數據也可以看出來,前三個分別就是年月日了,所以我們要提取這三個數字:
d = date(*as_tuple[:3])
date()這個方法需要三個參數,分別是年月日,所以我們提取元組的前三個數字正好可以:
我們打印一下:
這個不就是我們需要的格式嗎?
等等,我是用斜杠“/”隔開的,這個怎么是“-”,我們改一下格式,通過strftime(string formate time)方法:
strftime = d.strftime('%Y/%m/%d')
打印一下:
這樣就完美了~
怎么獲取合并單元格
我們轉到sheet2
可以看到第六行的2-5列都是合并單元格,內容是無,第七行和第八行的第二列是合并單元格,內容是無,第七行和第八行的第四和第五列是合并單元格,內容是啥都沒有。
我們需要用到方法:merged_cells
sheet2 = workbook.sheet_by_name('Sheet2') print(sheet2.merged_cells)
輸出結果:
[(5, 6, 1, 5), (6, 8, 1, 2), (6, 8, 3, 5)]
這個5615,6812,6835啥意思?
四個參數分別為行、行最大(不超過最大行)、列、列最大(不超過最大列)
拿5615舉例子,第五行到第六行的左閉右開區間[5,6),這就是第五行,[1,5)表示第一列到第四列,我們看:
由于python是從零開始,所以python的第五行,實際上是Excel的第六行,第1-4列就 是 2-5列,這不就是無嗎?這只是告訴你哪些是合并單元格,想打印怎么辦?
print(sheet2.cell_value(5, 1)) print(sheet2.cell_value(6, 1)) print(sheet2.cell_value(6, 3))
只去第一個和第三個參數就可以打印出來啦
看到這里說明你真的很努力~看懂為主哦!感謝點贊,有錯誤請指正,有問題留言告訴我!Bye Bye
到此這篇關于Python3使用xlrd、xlwt處理Excel方法數據的文章就介紹到這了,更多相關Python3使用xlrd、xlwt處理Excel內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。