小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Python讀寫Excel文件第三方庫匯總,你想要的都在這兒!

 北方的白樺林 2019-11-23

常見庫簡介

xlrd

xlrd是一個從Excel文件讀取數(shù)據(jù)和格式化信息的庫,支持.xls以及.xlsx文件。
http://xlrd./en/latest/
    1、xlrd支持.xls,.xlsx文件的讀
    2、通過設(shè)置on_demand變量使open_workbook()函數(shù)只加載那些需要的sheet,從而節(jié)省時間和內(nèi)存(該方法對.xlsx文件無效)。
    3、xlrd.Book對象有一個unload_sheet方法,它將從內(nèi)存中卸載工作表,由工作表索引或工作表名稱指定(該方法對.xlsx文件無效)

xlwt
xlwt是一個用于將數(shù)據(jù)和格式化信息寫入舊Excel文件的庫(如.xls)。
https://xlwt./en/latest/
    1、xlwt支持.xls文件寫。

xlutils

xlutils是一個處理Excel文件的庫,依賴于xlrd和xlwt。
http://xlutils./en/latest/
    1、xlutils支持.xls文件。
    2、支持Excel操作。

xlwings

xlwings是一個可以實現(xiàn)從Excel調(diào)用Python,也可在python中調(diào)用Excel的庫。
http://docs./en/stable/index.html
    1、xlwings支持.xls讀,支持.xlsx文件讀寫。
    2、支持Excel操作。
    3、支持VBA。
    4、強大的轉(zhuǎn)換器可以處理大部分?jǐn)?shù)據(jù)類型,包括在兩個方向上的numpy array和pandas DataFrame。

openpyxl
openpyxl是一個用于讀取和編寫Excel 2010 xlsx/xlsm/xltx/xltm文件的庫。
https://openpyxl./en/stable/
    1、openpyxl支持.xlsx文件的讀寫。
    2、支持Excel操作。
    3、加載大.xlsx文件可以使用read_only模式。
    4、寫入大.xlsx文件可以使用write_only模式。

xlsxwriter
xlsxwriter是一個用于創(chuàng)建Excel .xlsx文件的庫。
https://xlsxwriter./
    1、xlswriter支持.xlsx文件的寫。
    2、支持VBA。
    3、寫入大.xlsx文件時使用內(nèi)存優(yōu)化模式。

win32com

win32com庫存在于pywin32中,是一個讀寫和處理Excel文件的庫。
http:///python-excel-mini-cookbook/
    1、win32com支持.xls,.xlsx文件的讀寫,支持.xlsx文件的寫。
    2、支持Excel操作。

DataNitro
DataNitro是一個內(nèi)嵌在Excel中的插件。
https:///docs/ 
    1、DataNitro支持.xls,.xlsx文件的讀寫。
    2、支持Excel操作。
    3、支持VBA。
    4、收費

pandas
pandas通過對Excel文件的讀寫實現(xiàn)數(shù)據(jù)輸入輸出
http://pandas./
    1、pandas支持.xls,.xlsx文件的讀寫。
    2、支持只加載每個表的單一工作頁。

環(huán)境配置及可實現(xiàn)操作


注:DataNitro作為插件使用需依托軟件本身。
參考:https://zhuanlan.zhihu.com/p/23998083

讀寫測試

測試計算機硬件和系統(tǒng)

電腦型號 微星 MS-7846 臺式電腦 
操作系統(tǒng) Windows 7 旗艦版 64位 SP1 ( DirectX 11 )
處理器 英特爾 Pentium(奔騰) G3260 @ 3.30GHz 雙核
主板 微星 H81M-P32L (MS-7846) ( 英特爾 Haswell - Lynx Point )
內(nèi)存 4 GB ( 金士頓 DDR3 1600MHz )
主硬盤 西數(shù) WDC WD5000AZLX-00ZR6A0 ( 500 GB / 7200 轉(zhuǎn)/分 )
顯卡 英特爾 Haswell Integrated Graphics Controller ( 256 MB / 微星 )

測試用例

用例1. 讀.xls文件的整個表(表有5個分頁,每個分頁有2000行1200列的整數(shù))。
用例2. 讀.xlsx文件的整個表(表有5個分頁,每個分頁有2000行1200列的整數(shù))。
用例3. 讀.xls文件的整個表(表有1個分頁,頁有2000行1200列的整數(shù))。
用例4. 讀.xlsx文件的整個表(表有1個分頁,頁有2000行1200列的整數(shù))。
用例5. 寫.xls文件的整個表(表有5個分頁,每個分頁有2000行1200列的整數(shù))。
用例6. 寫.xlsx文件的整個表(表有5個分頁,每個分頁有2000行1200列的整數(shù))。
用例7. 寫.xls文件的整個表(表有1個分頁,頁有2000行1200列的整數(shù))。
用例8. 寫.xlsx文件的整個表(表有1個分頁,頁有2000行1200列的整數(shù))。

測試結(jié)果


    注1.xlwt和pandas每個工作頁最多寫入256列,因此測試用例修改為每頁有2000行256列的整數(shù).
    注2.xlutils讀寫依賴于xlrd和xlwt,不單獨測試。
    注3.openpyxl測試兩種模式,一是普通加載寫入,二是read_only/write_only模式下的加載寫入。
    注4.DataNitro要收費,且需依托Excel使用,本次不測試。

讀寫性能比較

    單從讀寫的性能上考慮,win32com的性能是最好的,xlwings其次。
    openpyxl雖然操作Excel的功能強大,但讀寫性能過于糟糕,尤其是寫大表時,會占用大量內(nèi)存(把我的4G內(nèi)存用完了),開啟read_only和write_only模式后對其性能有大幅提升,尤其是對讀的性能提升很大,使其幾乎不耗時(0.01秒有點夸張,不過確實是加載上了)。pandas把Excel當(dāng)作數(shù)據(jù)讀寫的容器,為其強大的數(shù)據(jù)分析服務(wù),因此讀寫性能表現(xiàn)中規(guī)中矩,但其對Excel文件兼容性是最好的,支持讀寫.xls,.xlsx文件,且支持只讀表中單一工作頁。同樣支持此功能的庫還有xlrd,但xlrd只支持讀,并不支持寫,且性能不突出,需要配合xlutils進行Excel操作,并使用xlwt保存數(shù)據(jù),而xlwt只能寫入.xls文件(另一個可以寫入.xls文件的庫是pandas,且這兩個寫入的Excel文件最多只能有256列,其余庫就我目前的了解均只能寫入.xlsx文件),性能一般。xlsxwriter功能單一,一般用來創(chuàng)建.xlsx文件,寫入性能中庸。win32com擁有最棒的讀寫性能,但該庫存在于pywin32的庫中,自身沒有完善的文檔,使用略吃力。xlwings擁有和win32com不相伯仲的讀寫性能,強大的轉(zhuǎn)換器可以處理大部分?jǐn)?shù)據(jù)類型,包括二維的numpy array和pandas DataFrame,可以輕松搞定數(shù)據(jù)分析的工作。
    綜合考慮,xlwings的表現(xiàn)最佳,正如其名,xlwings——Make Excel Fly!

便捷性比較

    本測試目前只是針對Excel文件的讀寫,并未涉及Excel操作,單從讀寫的便捷性來講,各庫的表現(xiàn)難分上下,但是win32com和xlwings這兩個庫可以在程序運行時實時在打開的Excel文件中進行操作,實現(xiàn)過程的可視化,其次xlwings的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換器使其可以快速的為Excel文件添加二維數(shù)據(jù)結(jié)構(gòu)而不需要在Excel文件中重定位數(shù)據(jù)的行和列,因此從讀寫的便捷性來比較,仍是xlwings勝出。

測試代碼

計時

  1. import timeit
  2. if __name__ == '__main__':
  3. # 使用timeit計時
  4. t = timeit.Timer('??()', setup='from __main__ import ??')
  5. print(t.timeit(number=1))

xlrd

  1. import xlrd
  2. def test_xlrd_on_demand_false():
  3. # f = xlrd.open_workbook('test_cases\\read_xls.xls', on_demand=False)
  4. f = xlrd.open_workbook('test_cases\\read_xlsx.xlsx', on_demand=False)
  5. def test_xlrd_on_demand_true():
  6. # f = xlrd.open_workbook('test_cases\\read_xls.xls', on_demand=True)
  7. f = xlrd.open_workbook('test_cases\\read_xlsx.xlsx', on_demand=True)
  8. f.sheet_by_index(0)

xlwt

  1. import xlwt
  2. book = xlwt.Workbook()
  3. def test_xlwt():
  4. for s in range(5):
  5. sheet = book.add_sheet(str(s))
  6. for i in range(2000):
  7. for j in range(256):
  8. sheet.write(i, j, 65536)
  9. book.save('test_cases\\write_xls.xls')

xlwings

  1. import xlwings
  2. def test_xlwings_read():
  3. # f = xlwings.Book('test_cases\\read_xls.xls')
  4. f = xlwings.Book('test_cases\\read_xlsx.xlsx')
  5. import numpy as np
  6. f = xlwings.Book('')
  7. d = np.zeros([2000, 1200])
  8. d += 65536
  9. def test_xlwings_write():
  10. for s in range(1):
  11. sheet = f.sheets.add()
  12. sheet.range('A1').value = d
  13. f.save('test_cases\\write_xlsx.xlsx')

openpyxl

  1. import openpyxl
  2. def test_openpyxl_read():
  3. f = openpyxl.load_workbook('test_cases\\read_xlsx.xlsx', read_only=True)
  4. c = [65536] * 1200
  5. f = openpyxl.Workbook(write_only=True)
  6. def test_openpyxl_write():
  7. for i in range(1):
  8. sheet = f.create_sheet(title=str(i))
  9. for row in range(2000):
  10. sheet.append(c)
  11. f.save('test_cases\\write_xlsx.xlsx')

xlsxwriter

  1. import xlsxwriter
  2. workbook = xlsxwriter.Workbook('test_cases\\write_xlsx.xlsx')
  3. def test_xlsxwriter():
  4. for s in range(1):
  5. worksheet = workbook.add_worksheet()
  6. for i in range(2000):
  7. for j in range(1200):
  8. worksheet.write(i, j, 65536)
  9. workbook.close()

win32com

  1. import win32com.client as win32
  2. excel = win32.gencache.EnsureDispatch('Excel.Application')
  3. def test_win32com_read():
  4. # wb = excel.Workbooks.Open('E:\\excel\\test_cases\\read_xls.xls')
  5. wb = excel.Workbooks.Open('E:\\excel\\test_cases\\read_xlsx.xlsx')
  6. # excel.Visible = True
  7. wb = excel.Workbooks.Add()
  8. def test_win32com_write():
  9. for i in range(1):
  10. ws = wb.Worksheets.Add()
  11. ws.Range("A1:ATD2000").Value = 65536
  12. wb.SaveAs('E:\\excel\\test_cases\\write_xlsx.xlsx')
  13. excel.Application.Quit()

pandas

  1. import pandas as pd
  2. def test_pandas_read():
  3. for i in range(1, 6):
  4. sheet_name = "Sheet" + str(i)
  5. # df = pd.read_excel('test_cases\\read_xls.xls', sheet_name)
  6. df = pd.read_excel('test_cases\\read_xlsx.xlsx', sheet_name)
  7. import numpy as np
  8. d = np.zeros([2000, 255])
  9. d += 65536
  10. df = pd.DataFrame(d)
  11. # writer = pd.ExcelWriter('test_cases\\write_xls.xls')
  12. writer = pd.ExcelWriter('test_cases\\write_xlsx.xlsx')
  13. def test_pandas_write():
  14. df.to_excel(writer, 'Sheet1')
  15. df.to_excel(writer, 'Sheet2')
  16. df.to_excel(writer, 'Sheet3')
  17. df.to_excel(writer, 'Sheet4')
  18. df.to_excel(writer, 'Sheet5')
  19. writer.save()

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多