加载前100行的Excel

时间:2019-01-02 20:29:16

标签: python excel pandas

我有一个很大的Excel文件,我只想加载前100行。熊猫似乎做得不好,因为在以下命令中加载大约需要10秒钟:

pd.read_excel('excel/BigFile.xlsx', nrows=100)

似乎花费的时间与根本没有通过nrows参数相同。有没有一种方法可以“快速”读取excel文件的前100行?如果不在大熊猫中,还有其他工具可以做到这一点吗?

2 个答案:

答案 0 :(得分:2)

原因

pandas在后​​台使用xlrd包来读取excel文件。 xlrd的默认行为似乎是将整个excel工作簿加载到内存中,而不管最后读取了什么数据。这可以解释为什么您在使用pd.read_excel()nrows参数时没有注意到加载时间的减少。

xlrd确实为load worksheets on demand提供了可能性,但是不幸的是,如果您的所有数据都在一个非常大的ex​​cel工作表中,那将无济于事(此外,似乎该选项没有不支持.xlsx文件)。

解决方案

excel解析包openpyxl确实为load individual excel rows on demand提供了可能性(即,仅将所需的excel行加载到内存中)。只需一点定制代码,就可以利用openpyxl来将您的Excel数据作为pandas数据框进行检索:

import openpyxl
import pandas as pd


def read_excel(filename, nrows):
    """Read out a subset of rows from the first worksheet of an excel workbook.

    This function will not load more excel rows than necessary into memory, and is 
    therefore well suited for very large excel files.

    Parameters
    ----------
    filename : str or file-like object
        Path to excel file.
    nrows : int
        Number of rows to parse (starting at the top).

    Returns
    -------
    pd.DataFrame
        Column labels are constructed from the first row of the excel worksheet.

    """
    # Parameter `read_only=True` leads to excel rows only being loaded as-needed
    book = openpyxl.load_workbook(filename=filename, read_only=True, data_only=True)
    first_sheet = book.worksheets[0]
    rows_generator = first_sheet.values

    header_row = next(rows_generator)
    data_rows = [row for (_, row) in zip(range(nrows - 1), rows_generator)]
    return pd.DataFrame(data_rows, columns=header_row)


# USAGE EXAMPLE
dframe = read_excel('very_large_workbook.xlsx', nrows=100)

在我的计算机上,使用此代码加载> 100MB单页excel工作簿的前100行仅需1秒,而对pd.read_excel(nrows=100)进行此操作需要2分钟以上。

答案 1 :(得分:2)

为此专门创建了sxl模块。要获取工作表的前100行:

import sxl

wb = sxl.Workbook('myfile.xlsx')
ws = wb.sheets[1]  # this gets the first sheet
data = ws.head(100)