大家可能可能會面臨這個問題:
1.成堆的科學(xué)實驗數(shù)據(jù)需要導(dǎo)入 Excel 進行分析
2.成堆的銷售數(shù)據(jù)表格等待統(tǒng)計
3.成堆的商品數(shù)據(jù)等待分析
作為人生苦短的 Python 程序員,該如何優(yōu)雅地操作 Excel?其實Python提供的操作Excel的庫有7個之多,到底哪個更好使用更加方便呢?首先讓我們來整體把握下不同庫的特點:
1.xlrd是一個從Excel文件讀取數(shù)據(jù)和格式化信息的庫,支持.xls以及.xlsx文件。官方文檔:http://xlrd.readthedocs.io/en/latest/
2.xlwt是一個用于將數(shù)據(jù)和格式化信息寫入舊Excel文件的庫(如.xls)。官方文檔:https://xlwt.readthedocs.io/en/latest/
3.xlutils是一個處理Excel文件的庫,依賴于xlrd和xlwt。它僅支持.xls文件的操作。 官方文檔:http://xlutils.readthedocs.io/en/latest/
4.xlwings 簡單強大,使用方便,可替代VBA。xlwings可以支持.xls讀,支持.xlsx文件讀寫。官方文檔:http://docs.xlwings.org/en/stable/index.html
5.XlsxWriter 是一個用來寫 .xlsx 文件格式的模塊,但不能用來讀取和修改 Excel 文件。官方文檔:https://xlsxwriter.readthedocs.io/
6.openpyxl是一個用于讀取和編寫Excel 2010 xlsx/xlsm/xltx/xltm文件的庫。官方文檔:https://openpyxl.readthedocs.io/en/stable/
7.pandas是一個進行數(shù)據(jù)處理和分析的強大模塊,有時也可以用來自動化處理Excel,官方文檔:http://pandas.pydata.org/
另外還有win32com,通過名字大家就知道離不開windows系統(tǒng),該庫存在于pywin32中,是一個讀寫和處理Excel文件的庫。但是我的電腦是Mac,就不做展開了。 官方文檔:http://pythonexcels.com/python-excel-mini-cookbook/
DataNitro呢?嚴格來說它是一個Excel 的插件,安裝也需單獨到官網(wǎng)下載。也是僅支持windows系統(tǒng)。 官方文檔:https://datanitro.com/
具體內(nèi)容大家也可以參看:http://www.python-excel.org
環(huán)境配置
安裝
7個模塊均為非標準庫,因此都需要在命令行中 pip/pip3進行安裝:
pip/pip3 install xlrd
pip/pip3 install xlwt
pip/pip3 install xlutils
pip/pip3 install xlwings
pip/pip3 install XlsxWriter
pip/pip3 install openpyxl
pip/pip3 install pandas
提示:
• xlutils 僅支持 xls 文件,即2003以下版本;
• xlwings 安裝成功后,如果運行提示報錯“ImportError: no module named win32api”,請再安裝 pypiwin32 或者 pywin32 包;
模塊導(dǎo)入
模塊的導(dǎo)入跟以往導(dǎo)入其他模塊一樣,使用import進行導(dǎo)入,如果名字比較長還可以使用as起個別名。
import xlrd
import xlwt
import xlwings as xw
import xlsxwriter
import openpyxl
import pandas as pd
xlutils 模塊是 xlrd和 xlwt之間的橋梁,最核心的作用是拷貝一份通過 xlrd 讀取到內(nèi)存中的 .xls 對象,然后再拷貝對象上通過 xlwt 修改 .xls 表格的內(nèi)容。xlutils 可以將 xlrd 的 Book 對象復(fù)制轉(zhuǎn)換為xlwt 的Workbook 對象。具體使用時通常導(dǎo)入的是模塊中的copy子模塊:
import xlutils.copy
文檔操作
由于設(shè)計模式的不同,導(dǎo)致基本的新建文件、修改文件、保存文件等功能在不同的庫中存在著一定差異,比如xlsxwriter并不支持打開或修改現(xiàn)有文件,xlwings不支持對新建文件的命名等等,但是分析發(fā)現(xiàn)xlwings和openpyxl是對excel操作支持最多的兩個庫。
特別要說明一下xlutils庫,xlrd、xlwt、xlutils 各自的功能都有局限性,但三者互為補充,覆蓋了Excel文件尤其是 .xls 文件的操作。xlwt 可以生成 .xls 文件,xlrd 可以讀取已經(jīng)存在的 .xls文件,xlutils 連接 xlrd 和 xlwt 兩個模塊,使用戶可以同時讀寫一個 .xls 文件。簡單來說,xlrd 負責讀、xlwt 負責寫、xlutils 負責提供輔助和銜接
性能對比
對幾個庫做了最基本的寫入和讀取測試,分別使用不同庫進行添加及讀取 5000行 * 800列 數(shù)據(jù)操作,得到所用時間,重復(fù)操作取平均值。另外在不同的電腦配置,不同的環(huán)境下結(jié)果肯定會有出入,數(shù)據(jù)僅供參考。
openpyxl雖然操作Excel的功能強大,但讀寫性能過于糟糕,尤其是寫大表時,會占用大量內(nèi)存,開啟readonly和writeonly模式后對其性能有大幅提升,尤其是對讀的性能提升很大,使其幾乎不耗時。
pandas把Excel當作數(shù)據(jù)讀寫的容器,為其強大的數(shù)據(jù)分析服務(wù),因此讀寫性能表現(xiàn)中規(guī)中矩,但其對Excel文件兼容性是最好的,支持讀寫.xls,.xlsx文件,且支持只讀表中單一工作頁。
同樣支持此功能的庫還有xlrd,但xlrd只支持讀,并不支持寫,且性能不突出,需要配合xlutils進行Excel操作。
xlsxwriter功能單一,一般用來創(chuàng)建.xlsx文件,寫入性能中庸。
綜合考慮,xlwings的表現(xiàn)最佳,正如其名,xlwings——Make Excel Fly!
通過以上分析,相信大家對幾個庫都有了簡單的了解。你可根據(jù)自己的需求和生產(chǎn)環(huán)境,選擇合適的 Python-Excel 模塊
附上一部分常用代碼:
xlwings基本代碼
import xlwings as xw
#連接到excel
workbook = xw.Book('你的excel文件的路徑')#連接excel文件
#連接到指定單元格
data_range = workbook.sheets('Sheet1').range('A1')
#寫入數(shù)據(jù)
data_range.value = ['a','b','c']
#保存
workbook.save()
xlsxwriter基本代碼
import xlsxwriter as xw
#新建excel
workbook = xw.Workbook('你的excel文件的路徑')
#新建工作薄
worksheet = workbook.add_worksheet()
#寫入數(shù)據(jù)
worksheet.wirte('A1','a')
#關(guān)閉保存
workbook.close()
xlutils基本代碼
import xlrd #讀取數(shù)據(jù)
import xlwt #寫入數(shù)據(jù)
import xlutils.copy #操作excel
# 通過xlrd讀取數(shù)據(jù)
#打開excel文件
workbook = xlrd.open_workbook('你的excel文件的路徑')
#獲取表單
worksheet = workbook.sheet_by_index(0)
#讀取數(shù)據(jù)
data = worksheet.cell_value(0,0)
# 通過xlwt寫入數(shù)據(jù)
#新建excel
wb = xlwt.Workbook()
#添加工作薄
sh = wb.add_sheet('Sheet1')
#寫入數(shù)據(jù)
sh.write(0,0,'abc')
#保存文件
wb.save('myexcel.xls')
#打開excel文件
book = xlrd.open_workbook('你的excel文件的路徑')
#復(fù)制一份
new_book = copy(book)
#拿到工作薄
worksheet = new_book.getsheet(0)
#寫入數(shù)據(jù)
worksheet.write(0,0,'mydata')
#保存
new_book.save()
openpyxl基本代碼
import openpyxl
# 新建文件
workbook = openpyxl.Workbook()
# 寫入文件
sheet = workbook.activesheet['A1']='A1'
# 保存文件
workbook.save('你的excel保存路徑')
本文目的并不是要評出一個最好的庫,僅是從不同角度對不同庫進行對比,希望能夠讓大家了解各個庫所擅長的工作。
只有充分了解不同工具的特點,才能夠在不同的場景下靈活運用不同的方法來高效解決問題!