欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Python xlwings 讀取Excel文件的正確姿勢(shì)

 更新時(shí)間:2021年02月26日 11:26:58   作者:techtalk  
這篇文章主要介紹了淺談Python xlwings 讀取Excel文件的正確姿勢(shì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

使用Python加載最新的Excel讀取類庫(kù)xlwings可以說(shuō)是Excel數(shù)據(jù)處理的利器,但使用起來(lái)還是有一些注意事項(xiàng),否則高大上的Python會(huì)跑的比老舊的VBA還要慢。

這里我們對(duì)比一下,用幾種不同的方法,從一個(gè)Excel表格中讀取一萬(wàn)行數(shù)據(jù),然后計(jì)算結(jié)果,看看他們的耗時(shí)。

1. 處理要求:

一個(gè)Excel表格中包含了3萬(wàn)條記錄,其中B,C兩個(gè)列記錄了某些計(jì)算值,讀取前一萬(wàn)行記錄,將這兩個(gè)列的差值進(jìn)行計(jì)算,然后匯總得出差的和。

文件是這個(gè)樣子:Book300s.xlsx 。

2. 處理方式有以下3種,我們對(duì)比一下耗時(shí)的大小。

處理方式 代碼名稱
1. 使用Python的xlwings類庫(kù),讀取Excel文件,然后采用Excel的Sheet和Range的引用方式讀取并計(jì)算 XLS_READ_SHEET.py
2. 直接使用Excel自帶的VBA語(yǔ)言進(jìn)行計(jì)算 VBA

3. 使用Python的xlwings類庫(kù),讀取Excel文件,然后采用Python的自帶數(shù)據(jù)類型List列表進(jìn)行數(shù)據(jù)存儲(chǔ)和計(jì)算

XLS_READ_LIST.py

3. 首先測(cè)試第一種,XLS_READ_SHEET.py

使用Python的xlwings類庫(kù),讀取Excel文件,然后引用Excel的Sheet和Range的方式來(lái)讀取并計(jì)算

#coding=utf-8
import xlwings as xw
import pandas as pd
import time

start_row = 2 # 處理Excel文件開(kāi)始行
end_row = 10002 # 處理Excel結(jié)束行

#記錄打開(kāi)表單開(kāi)始時(shí)間
start_open_time = time.time()

#指定不顯示地打開(kāi)Excel,讀取Excel文件
app = xw.App(visible=False, add_book=False)
wb = app.books.open('D:/PYTHON/TEST_CODE/Book300s.xlsx') # 打開(kāi)Excel文件
sheet = wb.sheets[0] # 選擇第0個(gè)表單

#記錄打開(kāi)Excel表單結(jié)束時(shí)間
end_open_time = time.time()

#記錄開(kāi)始循環(huán)計(jì)算時(shí)間
start_run = time.time()

row_content = []
#讀取Excel表單前10000行的數(shù)據(jù),Python的in range是左閉右開(kāi)的,到10002結(jié)束,但區(qū)間只包含2到10001這一萬(wàn)條
for row in range(start_row, end_row):
  row_str = str(row)
  #循環(huán)中引用Excel的sheet和range的對(duì)象,讀取B列和C列的每一行的值,對(duì)比計(jì)算
  start_value = sheet.range('B' + row_str).value
  end_value = sheet.range('C' + row_str).value
  if start_value <= end_value:
    values = end_value - start_value
    #同時(shí)測(cè)試List數(shù)組添加記錄
    row_content.append(values)

#計(jì)算和
total_values = sum(row_content)

#記錄結(jié)束循環(huán)計(jì)算時(shí)間
end_run = time.time()
sheet.range('E2').value = str(total_values)
sheet.range('E3').value = '使用Sheet計(jì)算時(shí)間(秒):' + str(end_run - start_run)

#保存并關(guān)閉Excel文件
wb.save()
wb.close()

print ('結(jié)果總和:', total_values)
print ('打開(kāi)并讀取Excel表單時(shí)間(秒):',  end_open_time - start_open_time)
print ('計(jì)算時(shí)間(秒):',  end_run - start_run)
print ('處理數(shù)據(jù)條數(shù):' , len(row_content))

用Python直接訪問(wèn)Sheet和Range取值的計(jì)算結(jié)果如下:

讀取Excel文件用時(shí) 4.47秒

處理Excel 10000 行數(shù)據(jù)花費(fèi)了117秒的時(shí)間。

4. 然后我們用Excel自帶的VBA語(yǔ)言來(lái)處理一下相同的計(jì)算。也是直接引用Sheet,Range等Excel對(duì)象,但VBA的數(shù)組功能實(shí)在是不好用,就不測(cè)試添加數(shù)組了。

Option Explicit

Sub VBA_CAL_Click()
  Dim i_count As Long
  Dim offset_value, total_offset_value As Double
  Dim st, et As Date
  st = Time()

  i_count = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
  i_count = 10001
  For i_count = 2 To i_count
     If Range("C" & i_count).Value > Range("B" & i_count).Value Then
       offset_value = Range("C" & i_count).Value - Range("B" & i_count).Value
       total_offset_value = total_offset_value + offset_value
     End If
  Next i_count

  et = Time()
  Range("E2").Value = total_offset_value
  Range("E3").Value = et - st

  MsgBox "Result: " & total_offset_value & Chr(10) & "Running time: " & et - st
End Sub

VBA處理計(jì)算結(jié)果如下:

保存了3萬(wàn)條數(shù)據(jù)的Excel文件是通過(guò)手工打開(kāi)的,在電腦上大概花費(fèi)了8.2秒的時(shí)間

處理Excel 前10000行數(shù)據(jù)花費(fèi)了1.16秒的時(shí)間。

5.使用Python的xlwings類庫(kù),讀取Excel文件,然后采用Python的自帶數(shù)據(jù)類型List進(jìn)行數(shù)據(jù)存儲(chǔ)和計(jì)算,計(jì)算完成后再將結(jié)果寫到Excel表格中

#coding=utf-8
import xlwings as xw
import pandas as pd
import time

#記錄打開(kāi)表單開(kāi)始時(shí)間
start_open_time = time.time()

#指定不顯示地打開(kāi)Excel,讀取Excel文件
app = xw.App(visible=False, add_book=False)
wb = app.books.open('D:/PYTHON/TEST_CODE/Book300s.xlsx') # 打開(kāi)Excel文件
sheet = wb.sheets[0] # 選擇第0個(gè)表單

#記錄打開(kāi)Excel表單結(jié)束時(shí)間
end_open_time = time.time()

#記錄開(kāi)始循環(huán)計(jì)算時(shí)間
start_run = time.time()

row_content = []
#讀取Excel表單前10000行的數(shù)據(jù),并計(jì)算B列和C列的差值之和
list_value = sheet.range('A2:D10001').value
for i in range(len(list_value)):
   #使用Python的類庫(kù)直接訪問(wèn)Excel的表單是很緩慢的,不要在Python的循環(huán)中引用sheet等Excel表單的單元格,
   #而是要用List一次性讀取Excel里的數(shù)據(jù),在List內(nèi)存中計(jì)算好了,然后返回結(jié)果
   start_value = list_value[i][1]
   end_value = list_value[i][2]
   if start_value <= end_value:
     values = end_value- start_value
     #同時(shí)測(cè)試List數(shù)組添加記錄
     row_content.append(values)

#計(jì)算和
total_values = sum(row_content)
#記錄結(jié)束循環(huán)計(jì)算時(shí)間
end_run = time.time()
sheet.range('E2').value = str(total_values)
sheet.range('E3').value = '使用List 計(jì)算時(shí)間(秒):' + str(end_run - start_run)

#保存并關(guān)閉Excel文件
wb.save()
wb.close()

print ('結(jié)果總和:', total_values)
print ('打開(kāi)并讀取Excel表單時(shí)間(秒):',  end_open_time - start_open_time)
print ('計(jì)算時(shí)間(秒):',  end_run - start_run)
print ('處理數(shù)據(jù)條數(shù):' , len(row_content))

用Python的LIST在內(nèi)存中計(jì)算結(jié)果如下:

讀取Excel文件用時(shí) 4.02秒

處理Excel 10000 行數(shù)據(jù)花費(fèi)了 0.10 秒的時(shí)間。

6 結(jié)論:

Python操作Excel的類庫(kù)有以往有 xlrd、xlwt、openpyxl、pyxll等,這些類庫(kù)有的只支持讀取,有的只支持寫入,并且有的不支持Excel的xlsx格式等。

所以我們采用了最新的開(kāi)源免費(fèi)的xlwings類庫(kù),xlwings能夠很方便的讀寫Excel文件中的數(shù)據(jù),并支持Excel的單元格格式修改,也可以與pandas等類庫(kù)集成使用。

VBA是微軟Excel的原生二次開(kāi)發(fā)語(yǔ)言,是辦公和數(shù)據(jù)統(tǒng)計(jì)的利器,在金融,統(tǒng)計(jì),管理,計(jì)算中應(yīng)用非常廣泛,但是VBA計(jì)算能力較差,支持的數(shù)據(jù)結(jié)構(gòu)少,編輯器粗糙。

雖然VBA有很多不足,但是VBA的宿主Office Excel卻是天才程序員基于C++開(kāi)發(fā)的作品,穩(wěn)定,高效,易用 。

有微軟加持,VBA雖然數(shù)據(jù)結(jié)構(gòu)少,運(yùn)行速度慢,但訪問(wèn)自己Excel的Sheet,Range,Cell等對(duì)象卻速度飛快,這就是一體化產(chǎn)品的優(yōu)勢(shì)。

VBA讀取Excel的Range,Cell等操作是通過(guò)底層的API直接讀取數(shù)據(jù)的,而不是通過(guò)微軟統(tǒng)一的外部開(kāi)發(fā)接口。所以Python的各種開(kāi)源和商用的Excel處理類庫(kù)如果和VBA來(lái)比較讀寫Excel格子里面的數(shù)據(jù),都是處于劣勢(shì)的(至少是不占優(yōu)勢(shì)的),例子2的VBA 花費(fèi)了1.16秒就能處理完一萬(wàn)條數(shù)據(jù)。

Python基于開(kāi)源,語(yǔ)法優(yōu)美而健壯,支持面向?qū)ο箝_(kāi)發(fā),最重要的是,Python有豐富而功能強(qiáng)大的類庫(kù),支持多種工作場(chǎng)景的開(kāi)發(fā)。

我們應(yīng)該認(rèn)識(shí)到,Excel對(duì)于Python而言,只是數(shù)據(jù)源文件的一種,當(dāng)處理大量數(shù)據(jù)時(shí),Python處理Excel就要把Excel當(dāng)數(shù)據(jù)源來(lái)處理,一次性地讀取數(shù)據(jù)到Python的數(shù)據(jù)結(jié)構(gòu)中,而不是大量調(diào)用Excel里的對(duì)象,不要說(shuō)頻繁地寫入Excel,就是頻繁地讀取Excel里面的某些單元格也是效率較低的。例子1的Python頻繁讀取Sheet,Range數(shù)據(jù),結(jié)果花費(fèi)了117秒才處理完一萬(wàn)條數(shù)據(jù)。

Python的計(jì)算效率和數(shù)據(jù)結(jié)構(gòu)的操作方便性可比VBA強(qiáng)上太多,和VBA聯(lián)合起來(lái)使用,各取所長(zhǎng)是個(gè)好主意。

當(dāng)Excel數(shù)據(jù)一次性讀入Python的內(nèi)存List數(shù)據(jù)結(jié)構(gòu)中,然后基于自身的List數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中計(jì)算,例子3的Python只用了 0.1秒就完成了一萬(wàn)條數(shù)據(jù)的計(jì)算并將結(jié)果寫回Excel。

總結(jié):

處理方式-計(jì)算Excel里的一萬(wàn)條記錄的差值的總和 效率
1. 使用Python的xlwings類庫(kù),采用Excel的Sheet和Range的引用方式,按行讀取Excel文件的記錄并計(jì)算 差,計(jì)算用時(shí) 117秒
2. 直接使用Excel自帶的VBA語(yǔ)言進(jìn)行計(jì)算,也是采用Excel的Sheet和Range的引用方式,按行讀取Excel文件的記錄并計(jì)算 很高 ,計(jì)算用時(shí) 1.16秒

3. 使用Python的xlwings類庫(kù),一次性讀取Excel文件中的數(shù)據(jù)到Python的List數(shù)據(jù)結(jié)構(gòu)中,然后在Python的List列表中進(jìn)行數(shù)據(jù)存儲(chǔ)和計(jì)算

最高,計(jì)算用時(shí) 0.1秒     

到此這篇關(guān)于淺談Python xlwings 讀取Excel文件的正確姿勢(shì)的文章就介紹到這了,更多相關(guān)Python xlwings 讀取Excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Python中append以及extend返回None的例子

    在Python中append以及extend返回None的例子

    今天小編就為大家分享一篇在Python中append以及extend返回None的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python+AI實(shí)現(xiàn)給老照片上色

    Python+AI實(shí)現(xiàn)給老照片上色

    今天給大家分享一個(gè)有趣的AI項(xiàng)目——利用NoGAN的圖像增強(qiáng)技術(shù)給老照片著色,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-06-06
  • Flask藍(lán)圖學(xué)習(xí)教程

    Flask藍(lán)圖學(xué)習(xí)教程

    在Flask中,使用藍(lán)圖Blueprint來(lái)分模塊組織管理。藍(lán)圖實(shí)際可以理解為是一個(gè)存儲(chǔ)一組視圖方法的容器對(duì)象,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-10-10
  • Python中matplotlib庫(kù)安裝失敗的經(jīng)驗(yàn)總結(jié)(附pycharm配置anaconda)

    Python中matplotlib庫(kù)安裝失敗的經(jīng)驗(yàn)總結(jié)(附pycharm配置anaconda)

    最近根據(jù)領(lǐng)導(dǎo)布置的學(xué)習(xí)任務(wù),開(kāi)始學(xué)習(xí)python中的matplotlib,朋友告訴我這個(gè)很簡(jiǎn)單,然而剛踏入安裝的門檻,就遇到了安裝不成功的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Python中matplotlib庫(kù)安裝失敗的經(jīng)驗(yàn)總結(jié),需要的朋友可以參考下
    2022-08-08
  • 圖文詳解python安裝Scrapy框架步驟

    圖文詳解python安裝Scrapy框架步驟

    在本篇內(nèi)容中我們給大家整理了關(guān)于python安裝Scrapy框架的圖文詳細(xì)步驟,需要的朋友們跟著學(xué)習(xí)下。
    2019-05-05
  • python讀取目錄下所有的jpg文件,并顯示第一張圖片的示例

    python讀取目錄下所有的jpg文件,并顯示第一張圖片的示例

    今天小編就為大家分享一篇python讀取目錄下所有的jpg文件,并顯示第一張圖片的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • 在Python Flask App中獲取已發(fā)布的JSON對(duì)象的解決方案

    在Python Flask App中獲取已發(fā)布的JSON對(duì)象的解決方案

    這篇文章主要介紹了在Python Flask App中獲取已發(fā)布的JSON對(duì)象的解決方案,文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-08-08
  • python解析命令行參數(shù)的三種方法詳解

    python解析命令行參數(shù)的三種方法詳解

    這篇文章主要介紹了python解析命令行參數(shù)的三種方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • python如何獲取當(dāng)前文件夾下所有文件名詳解

    python如何獲取當(dāng)前文件夾下所有文件名詳解

    這篇文章主要給大家介紹了關(guān)于python如何獲取當(dāng)前文件夾下所有文件名的相關(guān)資料,文中給出了詳細(xì)的示例代碼,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧
    2019-01-01
  • Python?PySpark案例實(shí)戰(zhàn)教程

    Python?PySpark案例實(shí)戰(zhàn)教程

    PySpark是由Spark官方開(kāi)發(fā)的Python語(yǔ)言第三方庫(kù),Python開(kāi)發(fā)者可以使用pip程序快速的安裝PySpark并像其它三方庫(kù)那樣直接使用,本文給大家介紹Python?PySpark案例實(shí)戰(zhàn),感興趣的朋友一起看看吧
    2023-09-09

最新評(píng)論