有没有更快的方法将excel文件读取到pandas数据帧

时间:2018-01-03 10:13:23

标签: python excel xlrd

我有大约700个excel文件,需要通过删除一些标题并更改一些列名来转换为csv文件。我设法实现了解决方案,但速度很慢。我发现使用pandas读取excel到数据帧需要花费大量时间,如下所示:

df = pd.read_excel(file_path, skiprows=self.skip_rows)

我猜有一些unix命令可以快速完成此操作。不过我想在python中找到解决方案。还有其他更快的库吗?另外我想知道为什么读取excel文件需要更长的时间,我可以理解,如果我们想要保留样式,excel的颜色应该花费更长时间。但是在我的情况下,我只需要将其读入数据帧。

以下是版本号:

  • python:2.7.12
  • pandas:0.21.0
  • xlrd:1.0.0

1 个答案:

答案 0 :(得分:0)

我发现熊猫用python读取大型excel工作簿很慢。 Openpylx也可能很慢,但是如果您只想从excel工作表中获取值,那么有一种方法可以使速度显着提高。

  1. 使用openpyxl以只读方式打开工作簿
  2. 获取所需的工作表
  3. 使用worksheet.values迭代器,使用islice仅提取所需的范围。您可以传递列号或字符串作为列ID

这些函数将很快返回您指定的值范围。

from openpyxl import load_workbook
from copy import copy,deepcopy
from itertools import islice
import string

def col2num(col):
    num = 0
    for c in col:
        if c in string.ascii_letters:
            num = num * 26 + (ord(c.upper()) - ord('A')) + 1
    return num

def get_worksheet_range(ws, r_start=1,c_start=1,r_end=-1,c_end=-1):
    if isinstance(c_start,int)==False:
        c_start=col2num(c_start)
    if isinstance(c_end,int)==False:
        c_end=col2num(c_end)
    if r_end<=0: r_end=ws.max_row
    if c_end<=0: c_end=ws.max_row
    outrange=[x[:] for x in [[None] * (c_end-c_start+1)] * (r_end-r_start+1)]
    i=0
    for row in islice(ws.values,r_start-1,r_end):
        j=0
        for value in islice(row,c_start-1,c_end-1):
            outrange[i][j]=value;j=j+1
        i=i+1
    return outrange

wb=load_workbook(filename=r"c:\some_excel_file.xlsx",read_only=True) 
ws=wb['SomeWorkSheet']
datarange=get_worksheet_range(ws)