Xlrd 打开 excel 文件非常慢
Xlrd very slow opening excel file
我有一个 excel 文件,我想它对于一个 excel 文件 (200Mb) 来说相当大,它有大约 20 sheet 的全部信息。
我的问题是,如果执行以下简单操作需要将近 5 分钟是正常的。我想知道我是否以正确的方式这样做。
import xlrd
def processExcel(excelFile):
excelData = xlrd.open_workbook(excelFile)
sheets = excelData.sheet_names()
print sheets
如您所见,第一步我只是尝试获取 sheet 个名称,而这个简单的事情只需要 5 分钟...这可能吗?
是的,这绝对有可能。 Excel 文件中的数据确实很多。默认情况下,xlrd
将整个工作簿加载到内存中。如果您的工作簿是 .xls 文件,您可以使用 on_demand
参数仅在需要时打开工作sheet:
import xlrd
def processExcel(excelFile):
excelData = xlrd.open_workbook(excelFile, on_demand=True)
sheets = excelData.sheet_names()
print sheets
如果您尝试打开 .xlsx 文件,on_demand
参数无效。
更新
如果您正在使用 Python3 并读取 .xlsx 文件,您可以尝试 sxl。这是一个只在需要时将内容读入内存的库。所以只需打开工作簿检索工作 sheet 名称就非常快。此外,如果您只需要作品的前几行sheet,它也可以相当快地获取这些内容。
如果你需要用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
将整个 sheet 保存在内存中。如果您的工作簿有多个 sheet,这可能仍然比 xlrd
更有效。但是,如果您需要将整个工作簿都放在内存中,那么您不妨坚持使用 xlrd
.
我有一个 excel 文件,我想它对于一个 excel 文件 (200Mb) 来说相当大,它有大约 20 sheet 的全部信息。
我的问题是,如果执行以下简单操作需要将近 5 分钟是正常的。我想知道我是否以正确的方式这样做。
import xlrd
def processExcel(excelFile):
excelData = xlrd.open_workbook(excelFile)
sheets = excelData.sheet_names()
print sheets
如您所见,第一步我只是尝试获取 sheet 个名称,而这个简单的事情只需要 5 分钟...这可能吗?
是的,这绝对有可能。 Excel 文件中的数据确实很多。默认情况下,xlrd
将整个工作簿加载到内存中。如果您的工作簿是 .xls 文件,您可以使用 on_demand
参数仅在需要时打开工作sheet:
import xlrd
def processExcel(excelFile):
excelData = xlrd.open_workbook(excelFile, on_demand=True)
sheets = excelData.sheet_names()
print sheets
如果您尝试打开 .xlsx 文件,on_demand
参数无效。
更新
如果您正在使用 Python3 并读取 .xlsx 文件,您可以尝试 sxl。这是一个只在需要时将内容读入内存的库。所以只需打开工作簿检索工作 sheet 名称就非常快。此外,如果您只需要作品的前几行sheet,它也可以相当快地获取这些内容。
如果你需要用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
将整个 sheet 保存在内存中。如果您的工作簿有多个 sheet,这可能仍然比 xlrd
更有效。但是,如果您需要将整个工作簿都放在内存中,那么您不妨坚持使用 xlrd
.