我有一个excel文件,我想这对于一个excel文件(200Mb)来说非常庞大,它有大约20页的信息。
我的问题是,如果以下简单操作执行需要将近5分钟是正常的。我想知道我是否以正确的方式这样做。
import xlrd
def processExcel(excelFile):
excelData = xlrd.open_workbook(excelFile)
sheets = excelData.sheet_names()
print sheets
正如你所看到的,在第一步我只是试图获取工作表名称,只有那么简单的事情需要5分钟......这可能吗?
答案 0 :(得分:6)
是的,这绝对是可能的。这确实是Excel文件中的大量数据。默认情况下,xlrd
将整个工作簿加载到内存中。如果您的工作簿是.xls文件,则可以使用on_demand
参数仅在需要时打开工作表:
import xlrd
def processExcel(excelFile):
excelData = xlrd.open_workbook(excelFile, on_demand=True)
sheets = excelData.sheet_names()
print sheets
如果您尝试打开.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)
但是,如果您需要随机访问所有行来进行处理,则必须将它们全部保存在内存中:
from sxl import Workbook
wb = Workbook('MyBigFile.xlsx')
ws = wb.sheets[1]
all_rows = list(ws.rows)
在这种情况下,all_rows
会将整个工作表保留在内存中。如果您的工作簿有多个工作表,这可能仍然比xlrd
更有效。但是如果你需要记忆中的整个工作簿,那么你也可以坚持xlrd
。