零基礎(chǔ)使用Python讀寫處理Excel表格的方法
引
由于需要解決大批量Excel處理的事情,與其手工操作還不如寫個簡單的代碼來處理,大致選了一下感覺還是Python最容易操作。
安裝庫Python環(huán)境
首先當然是配環(huán)境,不過選Python的一個重要原因就是Mac內(nèi)是自帶Python環(huán)境的,不需要額外的配置環(huán)境,省下了一筆工作,如果你用的是Windows系統(tǒng),那就還需要配置一下Python的環(huán)境了,我Mac的Python版本是2.7。
第三方庫
Python自己是不支持直接操作Excel的,但是Python強大之處就在于有大量好用的第三方庫,這里我們選用讀Excel的xlrd庫和寫Excel的xlwt庫來操作。
關(guān)于第三方庫的安裝很簡單,首先,去專門下載Python庫的網(wǎng)站下載兩個庫的源碼:
* 下載xlrd
* 下載xlwt
注意對于新手來說最簡單的安裝方式就是源碼安裝,不需要去折騰第三方庫的管理器,直接點擊這個先下載兩個庫的源碼:


你看他后面也描述了類型是源碼嘛。
下載好之后在mac中解壓,得到文件夾,可以看到里面都是有一個 setup.py 文件的:

這里當然不是直接雙擊安裝了,py類型表示它是一個Python代碼文件,雙擊只會打開文件看代碼。我們要使用終端,輸入命令號進入當前所在的文件夾,比如我把文件放在了“下載”中,那么做法是:
$ cd Downloads/
$ cd xlwt-1.1.2
$ sudo python setup.py install
這里 cd 的意思是進入該文件夾,sudo 的意思是使用管理員權(quán)限安裝,不使用的話會告訴你沒有權(quán)限的,回車后會要你輸入電腦密碼,輸入后回車即可,python 是執(zhí)行 python代碼文件的命令,install 就是安裝了。
然后會看到刷刷刷一堆文字過去,最后告訴你 finished 了,就是安裝完成了。
xlrd 也是同樣的安裝方式。
寫代碼
讀寫Excel的第三方庫都安裝好了,就可以開始寫代碼了。
我們在一個文件夾下創(chuàng)建一個 hello.py 文件,然后用sublime之類的文檔編輯器打開它,開始編寫代碼。(PS:Python中 # 號開頭表示注釋)
讀Excel
# -*- 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)
#根據(jù)名稱獲取Excel表格中的數(shù)據(jù) 參數(shù):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) #根據(jù)sheet名字來獲取excel中的sheet
nrows = table.nrows #行數(shù)
colnames = table.row_values(colnameindex) #某一行數(shù)據(jù)
list =[] #裝讀取結(jié)果的序列
for rownum in range(0, nrows): #遍歷每一行的內(nèi)容
row = table.row_values(rownum) #根據(jù)行號獲取行
if row: #如果行存在
app = [] #一行的內(nèi)容
for i in range(len(colnames)): #一列列地讀取行的內(nèi)容
app.append(row[i])
list.append(app) #裝載數(shù)據(jù)
return list
#主函數(shù)
def main():
tables = excel_table_byname()
for row in tables:
print row
if __name__=="__main__":
main()
這個代碼很多我都注釋了,只講幾個要注意的地方,首先最開始我們設(shè)置了utp8編碼,然后一定要記得導入xlrd包,這樣才能使用它的函數(shù)去讀取excel。里面的 main() 是主函數(shù),python 會運行這個函數(shù),這個函數(shù)調(diào)用了其余的函數(shù)來讀取數(shù)據(jù)。這個代碼實現(xiàn)的是將excel文件 test.xlsx 中的 Sheet1 表中的數(shù)據(jù)一行行讀取出來并打印。
Excel中內(nèi)容如下:

有兩行內(nèi)容。
要運行這個代碼,需要用終端使用命令行,首先 cd 進入到代碼所在的文件夾,代碼和Excel文件都要放在這個文件夾里。然后使用 python hello.py 命令來運行這個代碼文件:

以上就是 Python 讀取并打印出來的內(nèi)容,u 表示使用的是unicode編碼,可以看到與Excel中是一致的。
創(chuàng)建Excel
使用xlwt庫我們可以創(chuàng)建一個Excel:
# -*- coding: utf-8 -*-
import xlwt
def testXlwt(file = 'new.xls'):
book = xlwt.Workbook() #創(chuàng)建一個Excel
sheet1 = book.add_sheet('hello') #在其中創(chuàng)建一個名為hello的sheet
sheet1.write(0,0,'cloudox') #往sheet里第一行第一列寫一個數(shù)據(jù)
sheet1.write(1,0,'ox') #往sheet里第二行第一列寫一個數(shù)據(jù)
book.save(file) #創(chuàng)建保存文件
#主函數(shù)
def main():
testXlwt()
if __name__=="__main__":
main()
這個代碼更簡單,同樣記得要在開頭導入庫。
代碼中我們創(chuàng)建了一個excel,在其中添加一個sheet,寫入兩個數(shù)據(jù),最后按照我們的命名保存了文件。
按照上面同樣的方法運行代碼后,終端中不會有打印的內(nèi)容,但是我們?nèi)ノ募A中看會得到一個名為 new.xls 的新excel文件,打開可以看到:

按照我們的方法寫了數(shù)據(jù),同時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+
也就是說,它只能創(chuàng)建 xls 的文件格式,不能創(chuàng)建現(xiàn)在的 xlsx 格式,其實有點老了,如果你把文件名寫了 xlsx 格式,將會無法打開。
處理Excel內(nèi)容
其實單獨的讀和寫只是基本功,我們最終是想要處理Excel中的內(nèi)容的。
這里我們假設(shè)一個使用場景,我們希望將Excel中所有第一列和第二列相同的行數(shù)據(jù)篩選出來保存到一個新的Excel中去。
那么我們的流程是:
打開目標Excel讀取內(nèi)容讀取每一行的同時篩選第一列和第二列相等的行保留下來創(chuàng)建一個新Excel將篩選出來的內(nèi)容寫進去保存新Excel
那么我們看代碼:
# -*- 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)
#根據(jù)索引獲取Excel表格中的數(shù)據(jù) 參數(shù):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] #根據(jù)sheet序號來獲取excel中的sheet
nrows = table.nrows #行數(shù)
ncols = table.ncols #列數(shù)
colnames = table.row_values(colnameindex) #某一行數(shù)據(jù)
list =[] #裝讀取結(jié)果的序列
for rownum in range(0,nrows): #遍歷每一行的內(nèi)容
row = table.row_values(rownum) #根據(jù)行號獲取行
if row: #如果行存在
app = [] #一行的內(nèi)容
for i in range(len(colnames)): #一列列地讀取行的內(nèi)容
app.append(row[i])
if app[0] == app[1] : #如果這一行的第一個和第二個數(shù)據(jù)相同才將其裝載到最終的list中
list.append(app)
testXlwt('new.xls', list) #調(diào)用寫函數(shù),講list內(nèi)容寫到一個新文件中
return list
#將list中的內(nèi)容寫入一個新的file文件
def testXlwt(file = 'new.xls', list = []):
book = xlwt.Workbook() #創(chuàng)建一個Excel
sheet1 = book.add_sheet('hello') #在其中創(chuàng)建一個名為hello的sheet
i = 0 #行序號
for app in list : #遍歷list每一行
j = 0 #列序號
for x in app : #遍歷該行中的每個內(nèi)容(也就是每一列的)
sheet1.write(i, j, x) #在新sheet中的第i行第j列寫入讀取到的x值
j = j+1 #列號遞增
i = i+1 #行號遞增
# sheet1.write(0,0,'cloudox') #往sheet里第一行第一列寫一個數(shù)據(jù)
# sheet1.write(1,0,'ox') #往sheet里第二行第一列寫一個數(shù)據(jù)
book.save(file) #創(chuàng)建保存文件
#主函數(shù)
def main():
tables = excel_table_byindex()
for row in tables:
print row
if __name__=="__main__":
main()
這次我們開頭要導入xlrd和xlwt兩個庫,因為既要讀也要寫。
代碼內(nèi)容基本與上面兩個差不多,有一點點加深,在讀取的時候我們判斷了第一列和第二列數(shù)據(jù)相同的行才加到list中去。在寫的時候我們用了兩個for循環(huán)來對新excel中的一個個單元格寫數(shù)據(jù),使用了i和j兩個變量來記錄位置。此外在獲取sheet的時候,與上面的不同,這里是通過sheet的序號(這里是0)來獲取的,上面的是通過sheet名稱來獲取。
我們要處理的Excel中的內(nèi)容是這樣的:

按道理我們篩選后只應該保留第一行的內(nèi)容,運行完后我們得到了一個新的Excel文件,里面的內(nèi)容如下:

可以看到和預期是相符的。
結(jié)
這里只是簡單的例子,兩個庫的操作還有很多,能夠進行的處理也有很多,如果要處理大量數(shù)據(jù),可能還要考慮內(nèi)存,分批次來處理,總之,本文只是一個入門,盡量追求零基礎(chǔ)也能學著使用來解放勞動力,更多的用法,就看自己琢磨了。
可以下載我的示例工程:https://github.com/Cloudox/PYReadWriteExcelDemo
以上所述是小編給大家介紹的Python讀寫處理Excel表格詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
網(wǎng)絡瀏覽器中運行Python腳本PyScript剖析
這篇文章主要為大家介紹了網(wǎng)絡瀏覽器中運行Python腳本PyScript剖析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08
如何將python中的List轉(zhuǎn)化成dictionary
這篇文章主要介紹在python中如何將list轉(zhuǎn)化成dictionary,通過提出兩個問題來告訴大家如何解決,有需要的可以參考借鑒。2016-08-08
Django框架HttpResponse和HttpRequest對象學習
這篇文章主要介紹了Django框架HttpResponse和HttpRequest對象學習,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家早日升職加薪2021-09-09
Flask進階之構(gòu)建RESTful?API和數(shù)據(jù)庫交互操作
這篇文章主要為大家介紹了Flask進階之構(gòu)建RESTful API和數(shù)據(jù)庫交互操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
Python實現(xiàn)擴展內(nèi)置類型的方法分析
這篇文章主要介紹了Python實現(xiàn)擴展內(nèi)置類型的方法,結(jié)合實例形式分析了Python嵌入內(nèi)置類型擴展及子類方式擴展的具體實現(xiàn)技巧,需要的朋友可以參考下2017-10-10
基于Python和TFIDF實現(xiàn)提取文本中的關(guān)鍵詞
TFIDF 的工作原理是按比例增加一個詞語在文檔中出現(xiàn)的次數(shù),但會被它所在的文檔數(shù)量抵消。本文將利用TFIDF實現(xiàn)提取文本中的關(guān)鍵詞,感興趣的小伙伴快跟隨小編一起學習一下吧2022-04-04
Python?class類@staticmethod及@classmethod區(qū)別淺析
這篇文章主要為大家介紹了Python?class類@staticmethod及@classmethod區(qū)別淺析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07

