引
由于需要解決大批量excel處理的事情,與其手工操作還不如寫個簡單的代碼來處理,大致選了一下感覺還是python最容易操作。
安裝庫python環境
首先當然是配環境,不過選python的一個重要原因就是mac內是自帶python環境的,不需要額外的配置環境,省下了一筆工作,如果你用的是windows系統,那就還需要配置一下python的環境了,我mac的python版本是2.7。
第三方庫
python自己是不支持直接操作excel的,但是python強大之處就在于有大量好用的第三方庫,這里我們選用讀excel的xlrd庫和寫excel的xlwt庫來操作。
關于第三方庫的安裝很簡單,首先,去專門下載python庫的網站下載兩個庫的源碼:
* 下載xlrd
* 下載xlwt
注意對于新手來說最簡單的安裝方式就是源碼安裝,不需要去折騰第三方庫的管理器,直接點擊這個先下載兩個庫的源碼:
你看他后面也描述了類型是源碼嘛。
下載好之后在mac中解壓,得到文件夾,可以看到里面都是有一個 setup.py 文件的:
這里當然不是直接雙擊安裝了,py類型表示它是一個python代碼文件,雙擊只會打開文件看代碼。我們要使用終端,輸入命令號進入當前所在的文件夾,比如我把文件放在了“下載”中,那么做法是:
$ cd downloads/
$ cd xlwt-1.1.2
$ sudo python setup.py install
這里 cd 的意思是進入該文件夾,sudo 的意思是使用管理員權限安裝,不使用的話會告訴你沒有權限的,回車后會要你輸入電腦密碼,輸入后回車即可,python 是執行 python代碼文件的命令,install 就是安裝了。
然后會看到刷刷刷一堆文字過去,最后告訴你 finished 了,就是安裝完成了。
xlrd 也是同樣的安裝方式。
寫代碼
讀寫excel的第三方庫都安裝好了,就可以開始寫代碼了。
我們在一個文件夾下創建一個 hello.py 文件,然后用sublime之類的文檔編輯器打開它,開始編寫代碼。(ps:python中 # 號開頭表示注釋)
讀excel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
# -*- coding: utf-8 -*- import xdrlib ,sys import xlrd #打開excel文件 def open_excel( file = 'test.xlsx' ): try : data = xlrd.open_workbook( file ) return data except exception,e: print str (e) #根據名稱獲取excel表格中的數據 參數:file:excel文件路徑 colnameindex:表頭列名所在行的索引 ,by_name:sheet1名稱 def excel_table_byname( file = 'test.xlsx' , colnameindex = 0 , by_name = u 'sheet1' ): data = open_excel( file ) #打開excel文件 table = data.sheet_by_name(by_name) #根據sheet名字來獲取excel中的sheet nrows = table.nrows #行數 colnames = table.row_values(colnameindex) #某一行數據 list = [] #裝讀取結果的序列 for rownum in range ( 0 , nrows): #遍歷每一行的內容 row = table.row_values(rownum) #根據行號獲取行 if row: #如果行存在 app = [] #一行的內容 for i in range ( len (colnames)): #一列列地讀取行的內容 app.append(row[i]) list .append(app) #裝載數據 return list #主函數 def main(): tables = excel_table_byname() for row in tables: print row if __name__ = = "__main__" : main() |
這個代碼很多我都注釋了,只講幾個要注意的地方,首先最開始我們設置了utp8編碼,然后一定要記得導入xlrd包,這樣才能使用它的函數去讀取excel。里面的 main() 是主函數,python 會運行這個函數,這個函數調用了其余的函數來讀取數據。這個代碼實現的是將excel文件 test.xlsx 中的 sheet1 表中的數據一行行讀取出來并打印。
excel中內容如下:
有兩行內容。
要運行這個代碼,需要用終端使用命令行,首先 cd 進入到代碼所在的文件夾,代碼和excel文件都要放在這個文件夾里。然后使用 python hello.py 命令來運行這個代碼文件:
以上就是 python 讀取并打印出來的內容,u 表示使用的是unicode編碼,可以看到與excel中是一致的。
創建excel
使用xlwt庫我們可以創建一個excel:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# -*- coding: utf-8 -*- import xlwt def testxlwt( file = 'new.xls' ): book = xlwt.workbook() #創建一個excel sheet1 = book.add_sheet( 'hello' ) #在其中創建一個名為hello的sheet sheet1.write( 0 , 0 , 'cloudox' ) #往sheet里第一行第一列寫一個數據 sheet1.write( 1 , 0 , 'ox' ) #往sheet里第二行第一列寫一個數據 book.save( file ) #創建保存文件 #主函數 def main(): testxlwt() if __name__ = = "__main__" : main() |
這個代碼更簡單,同樣記得要在開頭導入庫。
代碼中我們創建了一個excel,在其中添加一個sheet,寫入兩個數據,最后按照我們的命名保存了文件。
按照上面同樣的方法運行代碼后,終端中不會有打印的內容,但是我們去文件夾中看會得到一個名為 new.xls 的新excel文件,打開可以看到:
按照我們的方法寫了數據,同時sheet名字也是hello。
值得注意的是,在xlwt庫的說明中有這么一句話:
library to create spreadsheet files compatible with ms excel 97/2000/xp/2003 xls files, on any platform, with python 2.6, 2.6, 3.3+
也就是說,它只能創建 xls 的文件格式,不能創建現在的 xlsx 格式,其實有點老了,如果你把文件名寫了 xlsx 格式,將會無法打開。
處理excel內容
其實單獨的讀和寫只是基本功,我們最終是想要處理excel中的內容的。
這里我們假設一個使用場景,我們希望將excel中所有第一列和第二列相同的行數據篩選出來保存到一個新的excel中去。
那么我們的流程是:
打開目標excel讀取內容讀取每一行的同時篩選第一列和第二列相等的行保留下來創建一個新excel將篩選出來的內容寫進去保存新excel
那么我們看代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
# -*- coding: utf-8 -*- import xdrlib ,sys import xlrd import xlwt #打開excel文件 def open_excel( file = 'test.xlsx' ): try : data = xlrd.open_workbook( file ) return data except exception,e: print str (e) #根據索引獲取excel表格中的數據 參數:file:excel文件路徑 colnameindex:表頭列名所在行的索引 ,by_index:表的索引 def excel_table_byindex( file = 'test.xlsx' ,colnameindex = 0 ,by_index = 0 ): data = open_excel( file ) #打開excel文件 table = data.sheets()[by_index] #根據sheet序號來獲取excel中的sheet nrows = table.nrows #行數 ncols = table.ncols #列數 colnames = table.row_values(colnameindex) #某一行數據 list = [] #裝讀取結果的序列 for rownum in range ( 0 ,nrows): #遍歷每一行的內容 row = table.row_values(rownum) #根據行號獲取行 if row: #如果行存在 app = [] #一行的內容 for i in range ( len (colnames)): #一列列地讀取行的內容 app.append(row[i]) if app[ 0 ] = = app[ 1 ] : #如果這一行的第一個和第二個數據相同才將其裝載到最終的list中 list .append(app) testxlwt( 'new.xls' , list ) #調用寫函數,講list內容寫到一個新文件中 return list #將list中的內容寫入一個新的file文件 def testxlwt( file = 'new.xls' , list = []): book = xlwt.workbook() #創建一個excel sheet1 = book.add_sheet( 'hello' ) #在其中創建一個名為hello的sheet i = 0 #行序號 for app in list : #遍歷list每一行 j = 0 #列序號 for x in app : #遍歷該行中的每個內容(也就是每一列的) sheet1.write(i, j, x) #在新sheet中的第i行第j列寫入讀取到的x值 j = j + 1 #列號遞增 i = i + 1 #行號遞增 # sheet1.write(0,0,'cloudox') #往sheet里第一行第一列寫一個數據 # sheet1.write(1,0,'ox') #往sheet里第二行第一列寫一個數據 book.save( file ) #創建保存文件 #主函數 def main(): tables = excel_table_byindex() for row in tables: print row if __name__ = = "__main__" : main() |
這次我們開頭要導入xlrd和xlwt兩個庫,因為既要讀也要寫。
代碼內容基本與上面兩個差不多,有一點點加深,在讀取的時候我們判斷了第一列和第二列數據相同的行才加到list中去。在寫的時候我們用了兩個for循環來對新excel中的一個個單元格寫數據,使用了i和j兩個變量來記錄位置。此外在獲取sheet的時候,與上面的不同,這里是通過sheet的序號(這里是0)來獲取的,上面的是通過sheet名稱來獲取。
我們要處理的excel中的內容是這樣的:
按道理我們篩選后只應該保留第一行的內容,運行完后我們得到了一個新的excel文件,里面的內容如下:
可以看到和預期是相符的。
結
這里只是簡單的例子,兩個庫的操作還有很多,能夠進行的處理也有很多,如果要處理大量數據,可能還要考慮內存,分批次來處理,總之,本文只是一個入門,盡量追求零基礎也能學著使用來解放勞動力,更多的用法,就看自己琢磨了。
可以下載我的示例工程:https://github.com/cloudox/pyreadwriteexceldemo
以上所述是小編給大家介紹的python讀寫處理excel表格詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:https://blog.csdn.net/Cloudox_/article/details/53812213