Xlrd打开excel文件非常慢

cod*_*ler 1 python excel xlrd

我有一个excel文件,我想这对于一个excel文件(200Mb)来说非常庞大,它有大约20页的信息.

我的问题是,如果以下简单操作执行需要将近5分钟是正常的.我想知道我是否以正确的方式做到这一点.

import xlrd

def processExcel(excelFile):
    excelData = xlrd.open_workbook(excelFile)
    sheets = excelData.sheet_names()
    print sheets
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,在第一步我只是试图获取工作表名称,只有那么简单的事情需要5分钟......这可能吗?

Joh*_*n Y 7

是的,这绝对是可能的.这确实是Excel文件中的大量数据.默认情况下,xlrd将整个工作簿加载到内存中.如果您的工作簿是.xls文件,则可以使用该on_demand参数仅在需要时打开工作表:

import xlrd

def processExcel(excelFile):
    excelData = xlrd.open_workbook(excelFile, on_demand=True)
    sheets = excelData.sheet_names()
    print sheets
Run Code Online (Sandbox Code Playgroud)

如果您尝试打开.xlsx文件,则该on_demand参数无效.

更新

如果您使用的是Python 3并且正在读取.xlsx文件,则可以尝试使用sxl.这是一个只根据需要将内容读入内存的库.因此,只需打开工作簿即可检索工作表名称非常快.此外,如果您只需要工作表的前几行,它也可以很快地获得它们.

如果你需要读取所有数据sxl,你必须遍历所有行,这可能比你更慢xlrd,但至少只会占用你需要的内存.例如,以下代码在任何给定时间只在内存中保留一行:

from sxl import Workbook

wb = Workbook('MyBigFile.xlsx')
ws = wb.sheets[1]
for row in ws.rows:
    print(row)
Run Code Online (Sandbox Code Playgroud)

但是,如果您需要随机访问所有行来进行处理,则必须将它们全部保存在内存中:

from sxl import Workbook

wb = Workbook('MyBigFile.xlsx')
ws = wb.sheets[1]
all_rows = list(ws.rows)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,all_rows将整个工作表保留在内存中.如果您的工作簿有多个工作表,这可能仍然比xlrd.但如果你需要你的整个工作簿记忆,那么你也可以坚持下去xlrd.

  • 我没有太多使用 [OpenPyXL](https://pypi.python.org/pypi/openpyxl) 的经验,但它的 [只读模式](http://openpyxl.readthedocs.org/en/latest/optimized .html) 应该有助于处理非常大的文件。这值得一试。 (2认同)