簡體   English   中英

openpyxl是用於讀取大xlsx文件的最快軟件包嗎?

[英]Is openpyxl the fastest package to use to read big xlsx files?

我是python初學者,但我正在編寫一個腳本,使用openpyxl將大xlsx文件(60000x187)讀取到Numpy數組中,以進行一些機器學習。 我的代碼:

from openpyxl import load_workbook
import re
from numpy import *

wb = load_workbook(filename = 'dataSheet.xlsx', use_iterators = True) #dataSheet.xlsx
ws1 = wb.get_sheet_by_name(name = 'LogFileData')

startCol = 1 #index from 1
startRow = 2 #start at least from 2 because header is in 1st row
endCol   = ws1.get_highest_column() #index of last used column, from 1
endRow   = ws1.get_highest_row() #index of last used row, indexed from 1
diff     = endRow - startRow + 1 #number of rows in the data array

header   = [] #contains the column labels
data     = zeros((0,endCol), dtype=float64) #2D array that holds the data

#puts the column headers into a list
for row in ws1.get_squared_range(1, 1, endCol, 1): #indexed from 1
    for cell in row:
        for match in re.findall("<(.*?)>", cell.value):
            header.append(match)

#indexed from 1 when using the ws1
#index from 0 when using the Numpy arrays, tempRow, tempPt, data
for index, row in enumerate(ws1.iter_rows(row_offset=1)):
    tempRow = zeros((1,0), dtype=float64)
    tempPt = zeros((1,1), dtype=float64)
    for cell in row:
        value = cell.value
        if isinstance(value, basestring):
            tempPt[0][0] = None
        else:
            tempPt[0][0]=value
        tempRow = hstack((tempRow,tempPt))
    data = vstack((data,tempRow))

openpyxl和optimized_reader是最快,最節省空間的方法嗎? 一位同事提到,與itertools或類似軟件包一起使用時,csv文件可能會更快。

編輯1:我的規格VMWare Python 2.6.5上的Ubuntu 10.04 LTS英特爾i5四核2.5GHz Windows 7企業版

我在2009年的MacBook上以20秒鍾的速度對經過優化的閱讀器進行了基准測試,可容納100萬個帶有數字的單元。 由於單元格的間接作用和模式匹配(在循環外部編譯模式),我希望您的代碼會稍受打擊,但我認為速度仍然可以接受。 如果可以輕松獲得CSV,當然會更快。

有興趣知道您的電話號碼。

讀取xlsx工作表的最快方法。

超過50萬行的56mb文件和4張紙耗時6s。

import zipfile
from bs4 import BeautifulSoup

paths = []
mySheet = 'Sheet Name'
filename = 'xlfile.xlsx'
file = zipfile.ZipFile(filename, "r")

for name in file.namelist():
    if name == 'xl/workbook.xml':
        data = BeautifulSoup(file.read(name), 'html.parser')
        sheets = data.find_all('sheet')
        for sheet in sheets:
            paths.append([sheet.get('name'), 'xl/worksheets/sheet' + str(sheet.get('sheetid')) + '.xml'])

for path in paths:
    if path[0] == mySheet:
        with file.open(path[1]) as reader:
            for row in reader:
                print(row)  ## do what ever you want with your data
        reader.close()

享受和快樂的編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM