Python 加快openpyxl的读取速度

Python 加快openpyxl的读取速度,python,openpyxl,Python,Openpyxl,我正在做一个相当大的程序,它再次从一个相当大的excel电子表格中获取数据。 出于某种奇怪的原因,加载这个巨大的excel文件需要花费很多时间,我希望以某种方式加快加载速度。 我做了我自己的研究,并尝试只读,但这不允许我读取任何单元格(至少以下面所示的方式)。欢迎提出任何建议 def LoadSheet(Filename,worksheet_nr): import time as t st = t.clock() wb = xl.load_workbook(str(Fil

我正在做一个相当大的程序,它再次从一个相当大的excel电子表格中获取数据。 出于某种奇怪的原因,加载这个巨大的excel文件需要花费很多时间,我希望以某种方式加快加载速度。 我做了我自己的研究,并尝试只读,但这不允许我读取任何单元格(至少以下面所示的方式)。欢迎提出任何建议

def LoadSheet(Filename,worksheet_nr):
    import time as t
    st = t.clock()
    wb = xl.load_workbook(str(Filename))#workbook, loading workbook
    Sheets = wb.get_sheet_names()#Worksheets, shows all sheets in the workbook loaded
    ActiveSheet = wb.get_sheet_by_name(Sheets[worksheet_nr])#Selects the first sheet
    print round(t.clock() - st,3), "seconds of loading time."
    print "Sheet is loaded and reading..."
    return ActiveSheet



def CountRC_nr(ActiveSheet, StartR,StartC):
    R = StartR#Selected starting Row number
    C = StartC#Selected starting Column number
    Val = None #Value in cell (Right now, none is selected, thus zero value)
    while (Val != "None"):
        Val = str(ActiveSheet.cell(row=R,column=C).value)
        R += 1

    NumberRows = R - StartR - 1
    Val = None
    R=StartR

    while (Val != "None"):
        Val = str(ActiveSheet.cell(row=R,column=C).value)
        C += 1
    NumberColumns = C - StartC - 1

    return NumberRows, NumberColumns
由于你们中的一些人要求了解我如何使用只读,下面是修改后的代码:

def LoadSheet(Filename,worksheet_nr):
    import time as t
    st = t.clock()
    wb = xl.load_workbook(str(Filename), read_only = True)#workbook, loading workbook
    Sheets = wb.get_sheet_names()#Worksheets, shows all sheets in the workbook loaded
    ActiveSheet = wb.get_sheet_by_name(Sheets[worksheet_nr])#Selects the first sheet
    print round(t.clock() - st,3), "seconds of loading time."
    print "Sheet is loaded and reading..."
    return ActiveSheet



def CountRC_nr(ActiveSheet, StartR,StartC):
    R = StartR#Selected starting Row number
    C = StartC#Selected starting Column number
    Val = None #Value in cell (Right now, none is selected, thus zero value)
    while (Val != "None"):
        Val = str(ActiveSheet.cell(row=R,column=C).value)
        R += 1

    NumberRows = R - StartR - 1
    Val = None
    R=StartR

    while (Val != "None"):
        Val = str(ActiveSheet.cell(row=R,column=C).value)
        C += 1
    NumberColumns = C - StartC - 1

    return NumberRows, NumberColumns

正如我已经说过的,您正在使用API。如果工作表的维度已知,那么您可以访问它们,否则您可以构建自己的计数器,这没有什么意义

只读模式对于单个查找非常快速,但由于每个查找都涉及到将行中的所有单元格解析到感兴趣的单元格,因此对于许多单元格(例如您的代码正在使用的单元格)来说效率非常低

wb = load_workbook(filename, read_only=True)
for ws in wb:
    print(ws.dimensions)
    for row in ws.rows:
         for cell in row:
             print(cell.value)  # do whatever you want with the cell

您可以使用
(cell.value表示行中的单元格)
轻松地将行转换为NumPy数组,但Pandas库也会将工作表直接读取到数据帧中。

正如我已经说过的,您正在使用API。如果工作表的维度已知,那么您可以访问它们,否则您可以构建自己的计数器,这没有什么意义

只读模式对于单个查找非常快速,但由于每个查找都涉及到将行中的所有单元格解析到感兴趣的单元格,因此对于许多单元格(例如您的代码正在使用的单元格)来说效率非常低

wb = load_workbook(filename, read_only=True)
for ws in wb:
    print(ws.dimensions)
    for row in ws.rows:
         for cell in row:
             print(cell.value)  # do whatever you want with the cell

您可以使用
(cell.value表示行中的单元格)
轻松地将行转换为NumPy数组,但Pandas库也会将工作表直接读取到数据帧中。

最好关注只读模式的问题。您的代码似乎也与OpenPyxlAPI不兼容。Charlie,对不起,我不明白您的意思。你反对openpyxl API是什么意思?一切正常,我只想加速,但我尝试的任何方法都行不通。如果您更了解如何执行此操作,请告诉我。请提供一些使用只读模式的实际示例代码(不要在此处使用
ws.cell()
)。Charlie Clark,如果不是通过ws.cell,我如何获取单元格值?或者更具体地说,对于我的代码,ActiveSheet.cell(R,C).value…?只需迭代行即可。在只读模式下使用
ws.cell
将迫使openpyxl一次又一次地开始解析文件,这非常缓慢。如果你有非常大的文件,只读是最好的选择。您可能还想看看xlrd,它的速度稍微快一点。最好关注只读模式的问题。您的代码似乎也与OpenPyxlAPI不兼容。Charlie,对不起,我不明白您的意思。你反对openpyxl API是什么意思?一切正常,我只想加速,但我尝试的任何方法都行不通。如果您更了解如何执行此操作,请告诉我。请提供一些使用只读模式的实际示例代码(不要在此处使用
ws.cell()
)。Charlie Clark,如果不是通过ws.cell,我如何获取单元格值?或者更具体地说,对于我的代码,ActiveSheet.cell(R,C).value…?只需迭代行即可。在只读模式下使用
ws.cell
将迫使openpyxl一次又一次地开始解析文件,这非常缓慢。如果你有非常大的文件,只读是最好的选择。您可能还想看看xlrd,它稍微快一点。