如何使用熊猫仅读取excel标头?

时间:2020-03-27 03:43:07

标签: python excel pandas dataframe

我知道用熊猫读过excel表:

import pandas as pd

table = pd.read_excel(io)

加载数据后,如果要获取表头:

table.columns

这种方法是可行的,但是有时我只想直接获取excel表的标题,尤其是当excel表的主体很大时,将数据表加载到内存中会非常耗时&它也是不必要的,有时甚至直接溢出并卡住。查看官方文档,看来我可以使用nrows参数来指定只能读取Excel的特定行,这意味着我可以使用它来读取第一行标题:

header = pd.read_excel(io, nrows = 0)

但是,我发现熊猫也无法阻止读取整个excel数据,它仍然会消耗大量时间和内存。您在处理此问题方面有丰富的经验吗?

3 个答案:

答案 0 :(得分:0)

import pandas as pd 

Frame=pd.read_excel("/content/data.xlsx" , header=0)
Frame.head()

答案 1 :(得分:0)

在互联网上找到的简单代码片段:

def read_excel(filename, nrows):
    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)

答案 2 :(得分:0)

这个函数sheet_rows直接使用openpyxl,而不是pandas; 它比 read_excel( nrows=0 ) 快得多,而且很简单:

#!/usr/bin/env python3

import openpyxl  # https://openpyxl.readthedocs.io

#...............................................................................
def sheet_rows( sheet, nrows=3, ncols=None, verbose=5 ) -> "list of lists":
    """ openpyxl sheet -> the first `nrows` rows x `ncols` columns
        verbose=5: print A1 .. A5, E1 .. E5 as lists
    """
    rows = sheet.iter_rows( max_row=nrows, max_col=ncols, values_only=True )
    rows = [list(r) for r in rows]  # generator -> list of lists
    if verbose:
        print( "\n-- %s  %d rows  %d cols" % (
                sheet.title, sheet.max_row, sheet.max_column ))
        for row in rows[:verbose]:
            trimNone = list( filter( None, row[:verbose] ))
            print( trimNone )
    return rows


# xlsxin = sys.argv[1]
wb = openpyxl.load_workbook( xlsxin, read_only=True )
print( "\n-- openpyxl.load_workbook( \"%s\" )" % xlsxin )

for sheetname in wb.sheetnames:
    sheet = wb[sheetname]

    rows = sheet_rows( sheet, nrows=nrows )

    df = (pd.DataFrame( rows )  # index= columns=
            .dropna( axis="index", how="all" )
            .dropna( axis="columns", how="all" ) 
            )
    print( df )
    # df.to_excel df.to_csv ...

pyexcel 下的“部分阅读” 说明大多数 Excel 读者 在做任何其他事情之前将所有数据读入内存 - 慢。 openpyxl iter_rows() 快速获取几行或几列,内存不知道。