零基礎(chǔ)使用Python讀寫(xiě)處理Excel表格

由于需要解決大批量Excel處理的事情癣漆,與其手工操作還不如寫(xiě)個(gè)簡(jiǎn)單的代碼來(lái)處理骑祟,大致選了一下感覺(jué)還是Python最容易操作晦攒。

安裝庫(kù)

Python環(huán)境

首先當(dāng)然是配環(huán)境,不過(guò)選Python的一個(gè)重要原因就是Mac內(nèi)是自帶Python環(huán)境的植阴,不需要額外的配置環(huán)境蟹瘾,省下了一筆工作,如果你用的是Windows系統(tǒng)掠手,那就還需要配置一下Python的環(huán)境了,我Mac的Python版本是2.7狸捕。

第三方庫(kù)

Python自己是不支持直接操作Excel的喷鸽,但是Python強(qiáng)大之處就在于有大量好用的第三方庫(kù),這里我們選用讀Excel的xlrd庫(kù)和寫(xiě)Excel的xlwt庫(kù)來(lái)操作灸拍。

關(guān)于第三方庫(kù)的安裝很簡(jiǎn)單做祝,首先砾省,去專(zhuān)門(mén)下載Python庫(kù)的網(wǎng)站下載兩個(gè)庫(kù)的源碼:

注意對(duì)于新手來(lái)說(shuō)最簡(jiǎn)單的安裝方式就是源碼安裝,不需要去折騰第三方庫(kù)的管理器混槐,直接點(diǎn)擊這個(gè)先下載兩個(gè)庫(kù)的源碼:

image.png
image.png

你看他后面也描述了類(lèi)型是源碼嘛编兄。

下載好之后在mac中解壓,得到文件夾声登,可以看到里面都是有一個(gè) setup.py 文件的:

image.png

這里當(dāng)然不是直接雙擊安裝了狠鸳,py類(lèi)型表示它是一個(gè)Python代碼文件,雙擊只會(huì)打開(kāi)文件看代碼悯嗓。我們要使用終端件舵,輸入命令號(hào)進(jìn)入當(dāng)前所在的文件夾,比如我把文件放在了“下載”中脯厨,那么做法是:

$ cd Downloads/
$ cd xlwt-1.1.2
$ sudo python setup.py install

這里 cd 的意思是進(jìn)入該文件夾铅祸,sudo 的意思是使用管理員權(quán)限安裝,不使用的話(huà)會(huì)告訴你沒(méi)有權(quán)限的合武,回車(chē)后會(huì)要你輸入電腦密碼临梗,輸入后回車(chē)即可,python 是執(zhí)行 python代碼文件的命令稼跳,install 就是安裝了盟庞。

然后會(huì)看到刷刷刷一堆文字過(guò)去,最后告訴你 finished 了岂贩,就是安裝完成了茫经。

xlrd 也是同樣的安裝方式。

寫(xiě)代碼

讀寫(xiě)Excel的第三方庫(kù)都安裝好了萎津,就可以開(kāi)始寫(xiě)代碼了卸伞。

我們?cè)谝粋€(gè)文件夾下創(chuàng)建一個(gè) hello.py 文件,然后用sublime之類(lèi)的文檔編輯器打開(kāi)它锉屈,開(kāi)始編寫(xiě)代碼荤傲。(PS:Python中 # 號(hào)開(kāi)頭表示注釋?zhuān)?/p>

讀Excel

# -*- coding: utf-8 -*- 
import  xdrlib ,sys
import xlrd

#打開(kāi)excel文件
def open_excel(file= 'test.xlsx'):
    try:
        data = xlrd.open_workbook(file)
        return data
    except Exception,e:
        print str(e)

#根據(jù)名稱(chēng)獲取Excel表格中的數(shù)據(jù)   參數(shù):file:Excel文件路徑     colnameindex:表頭列名所在行的索引  ,by_name:Sheet1名稱(chēng)
def excel_table_byname(file= 'test.xlsx', colnameindex=0, by_name=u'Sheet1'):
    data = open_excel(file) #打開(kāi)excel文件
    table = data.sheet_by_name(by_name) #根據(jù)sheet名字來(lái)獲取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ù)行號(hào)獲取行
         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()

這個(gè)代碼很多我都注釋了颈渊,只講幾個(gè)要注意的地方遂黍,首先最開(kāi)始我們?cè)O(shè)置了utp8編碼,然后一定要記得導(dǎo)入xlrd包俊嗽,這樣才能使用它的函數(shù)去讀取excel雾家。里面的 main() 是主函數(shù),python 會(huì)運(yùn)行這個(gè)函數(shù)绍豁,這個(gè)函數(shù)調(diào)用了其余的函數(shù)來(lái)讀取數(shù)據(jù)芯咧。這個(gè)代碼實(shí)現(xiàn)的是將excel文件 test.xlsx 中的 Sheet1 表中的數(shù)據(jù)一行行讀取出來(lái)并打印。

Excel中內(nèi)容如下:


image.png

有兩行內(nèi)容。

要運(yùn)行這個(gè)代碼敬飒,需要用終端使用命令行邪铲,首先 cd 進(jìn)入到代碼所在的文件夾,代碼和Excel文件都要放在這個(gè)文件夾里无拗。然后使用 python hello.py 命令來(lái)運(yùn)行這個(gè)代碼文件:

image.png

以上就是 Python 讀取并打印出來(lái)的內(nèi)容带到,u 表示使用的是unicode編碼,可以看到與Excel中是一致的英染。

創(chuàng)建Excel

使用xlwt庫(kù)我們可以創(chuàng)建一個(gè)Excel:

# -*- coding: utf-8 -*- 
import xlwt

def testXlwt(file = 'new.xls'):
    book = xlwt.Workbook() #創(chuàng)建一個(gè)Excel
    sheet1 = book.add_sheet('hello') #在其中創(chuàng)建一個(gè)名為hello的sheet
    sheet1.write(0,0,'cloudox') #往sheet里第一行第一列寫(xiě)一個(gè)數(shù)據(jù)
    sheet1.write(1,0,'ox') #往sheet里第二行第一列寫(xiě)一個(gè)數(shù)據(jù)
    book.save(file) #創(chuàng)建保存文件

#主函數(shù)
def main():
   testXlwt()

if __name__=="__main__":
    main()

這個(gè)代碼更簡(jiǎn)單揽惹,同樣記得要在開(kāi)頭導(dǎo)入庫(kù)。

代碼中我們創(chuàng)建了一個(gè)excel税迷,在其中添加一個(gè)sheet永丝,寫(xiě)入兩個(gè)數(shù)據(jù),最后按照我們的命名保存了文件箭养。

按照上面同樣的方法運(yùn)行代碼后慕嚷,終端中不會(huì)有打印的內(nèi)容蹋嵌,但是我們?nèi)ノ募A中看會(huì)得到一個(gè)名為 new.xls 的新excel文件蹦魔,打開(kāi)可以看到:

image.png

按照我們的方法寫(xiě)了數(shù)據(jù),同時(shí)sheet名字也是hello憎兽。

值得注意的是撼泛,在xlwt庫(kù)的說(shuō)明中有這么一句話(huà):

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+

也就是說(shuō)挠说,它只能創(chuàng)建 xls 的文件格式,不能創(chuàng)建現(xiàn)在的 xlsx 格式愿题,其實(shí)有點(diǎn)老了损俭,如果你把文件名寫(xiě)了 xlsx 格式,將會(huì)無(wú)法打開(kāi)潘酗。

處理Excel內(nèi)容

其實(shí)單獨(dú)的讀和寫(xiě)只是基本功杆兵,我們最終是想要處理Excel中的內(nèi)容的。

這里我們假設(shè)一個(gè)使用場(chǎng)景仔夺,我們希望將Excel中所有第一列和第二列相同的行數(shù)據(jù)篩選出來(lái)保存到一個(gè)新的Excel中去琐脏。

那么我們的流程是:

  1. 打開(kāi)目標(biāo)Excel
  2. 讀取內(nèi)容
  3. 讀取每一行的同時(shí)篩選第一列和第二列相等的行保留下來(lái)
  4. 創(chuàng)建一個(gè)新Excel
  5. 將篩選出來(lái)的內(nèi)容寫(xiě)進(jìn)去
  6. 保存新Excel

那么我們看代碼:

# -*- coding: utf-8 -*- 
import  xdrlib ,sys
import xlrd
import xlwt

#打開(kāi)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) #打開(kāi)excel文件
    table = data.sheets()[by_index] #根據(jù)sheet序號(hào)來(lái)獲取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ù)行號(hào)獲取行
         if row: #如果行存在
             app = [] #一行的內(nèi)容
             for i in range(len(colnames)): #一列列地讀取行的內(nèi)容
                app.append(row[i])
             if app[0] == app[1] : #如果這一行的第一個(gè)和第二個(gè)數(shù)據(jù)相同才將其裝載到最終的list中
                list.append(app)
    testXlwt('new.xls', list) #調(diào)用寫(xiě)函數(shù)缸兔,講list內(nèi)容寫(xiě)到一個(gè)新文件中
    return list

#將list中的內(nèi)容寫(xiě)入一個(gè)新的file文件
def testXlwt(file = 'new.xls', list = []):
    book = xlwt.Workbook() #創(chuàng)建一個(gè)Excel
    sheet1 = book.add_sheet('hello') #在其中創(chuàng)建一個(gè)名為hello的sheet
    i = 0 #行序號(hào)
    for app in list : #遍歷list每一行
        j = 0 #列序號(hào)
        for x in app : #遍歷該行中的每個(gè)內(nèi)容(也就是每一列的)
            sheet1.write(i, j, x) #在新sheet中的第i行第j列寫(xiě)入讀取到的x值
            j = j+1 #列號(hào)遞增
        i = i+1 #行號(hào)遞增
    # sheet1.write(0,0,'cloudox') #往sheet里第一行第一列寫(xiě)一個(gè)數(shù)據(jù)
    # sheet1.write(1,0,'ox') #往sheet里第二行第一列寫(xiě)一個(gè)數(shù)據(jù)
    book.save(file) #創(chuàng)建保存文件

#主函數(shù)
def main():
   tables = excel_table_byindex()
   for row in tables:
       print row

if __name__=="__main__":
    main()

這次我們開(kāi)頭要導(dǎo)入xlrd和xlwt兩個(gè)庫(kù)日裙,因?yàn)榧纫x也要寫(xiě)。

代碼內(nèi)容基本與上面兩個(gè)差不多惰蜜,有一點(diǎn)點(diǎn)加深昂拂,在讀取的時(shí)候我們判斷了第一列和第二列數(shù)據(jù)相同的行才加到list中去。在寫(xiě)的時(shí)候我們用了兩個(gè)for循環(huán)來(lái)對(duì)新excel中的一個(gè)個(gè)單元格寫(xiě)數(shù)據(jù)抛猖,使用了i和j兩個(gè)變量來(lái)記錄位置政钟。此外在獲取sheet的時(shí)候路克,與上面的不同樟结,這里是通過(guò)sheet的序號(hào)(這里是0)來(lái)獲取的养交,上面的是通過(guò)sheet名稱(chēng)來(lái)獲取。

我們要處理的Excel中的內(nèi)容是這樣的:

image.png

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

image.png

可以看到和預(yù)期是相符的。

結(jié)

這里只是簡(jiǎn)單的例子驮履,兩個(gè)庫(kù)的操作還有很多鱼辙,能夠進(jìn)行的處理也有很多,如果要處理大量數(shù)據(jù)玫镐,可能還要考慮內(nèi)存倒戏,分批次來(lái)處理,總之恐似,本文只是一個(gè)入門(mén)杜跷,盡量追求零基礎(chǔ)也能學(xué)著使用來(lái)解放勞動(dòng)力,更多的用法矫夷,就看自己琢磨了葛闷。

可以下載我的示例工程:https://github.com/Cloudox/PYReadWriteExcelDemo


查看作者首頁(yè)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市双藕,隨后出現(xiàn)的幾起案子淑趾,更是在濱河造成了極大的恐慌,老刑警劉巖忧陪,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扣泊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嘶摊,警方通過(guò)查閱死者的電腦和手機(jī)延蟹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)更卒,“玉大人等孵,你說(shuō)我怎么就攤上這事□蹇眨” “怎么了俯萌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)上枕。 經(jīng)常有香客問(wèn)我咐熙,道長(zhǎng),這世上最難降的妖魔是什么辨萍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任棋恼,我火速辦了婚禮返弹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爪飘。我一直安慰自己义起,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布师崎。 她就那樣靜靜地躺著默终,像睡著了一般。 火紅的嫁衣襯著肌膚如雪犁罩。 梳的紋絲不亂的頭發(fā)上齐蔽,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音床估,去河邊找鬼含滴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丐巫,可吹牛的內(nèi)容都是我干的谈况。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鞋吉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鸦做!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起谓着,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤泼诱,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后赊锚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體治筒,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年舷蒲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耸袜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牲平,死狀恐怖堤框,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纵柿,我是刑警寧澤蜈抓,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站昂儒,受9級(jí)特大地震影響沟使,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜渊跋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一腊嗡、第九天 我趴在偏房一處隱蔽的房頂上張望着倾。 院中可真熱鬧,春花似錦燕少、人聲如沸卡者。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)虎眨。三九已至,卻和暖如春镶摘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岳守。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工凄敢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人湿痢。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓涝缝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親譬重。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拒逮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    aimaile閱讀 26,480評(píng)論 6 427
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,085評(píng)論 25 707
  • python學(xué)習(xí)筆記 聲明:學(xué)習(xí)筆記主要是根據(jù)廖雪峰官方網(wǎng)站python學(xué)習(xí)學(xué)習(xí)的,另外根據(jù)自己平時(shí)的積累進(jìn)行修正...
    renyangfar閱讀 3,044評(píng)論 0 10
  • 每個(gè)人都有做夢(mèng)的權(quán)利臀规,如果是美夢(mèng)滩援,幸好,我堅(jiān)持了塔嬉;哪怕是噩夢(mèng)玩徊,至少我證明過(guò)。
    桀驁麋鹿閱讀 371評(píng)論 0 0
  • ⑤天津之眼 在此之前去了商業(yè)街吃飯谨究,想吃烤肉(沒(méi)錯(cuò)我自己吃)但是地圖顯示的那個(gè)地方我一直沒(méi)找到恩袱,第二次去也沒(méi)能找到...
    蠢兔嘰閱讀 257評(píng)論 0 0