我知道用熊猫读过excel表:
import pandas as pd
table = pd.read_excel(io)
加载数据后,如果要获取表头:
table.columns
这种方法是可行的,但是有时我只想直接获取excel表的标题,尤其是当excel表的主体很大时,将数据表加载到内存中会非常耗时&它也是不必要的,有时甚至直接溢出并卡住。查看官方文档,看来我可以使用nrows
参数来指定只能读取Excel的特定行,这意味着我可以使用它来读取第一行标题:
header = pd.read_excel(io, nrows = 0)
但是,我发现熊猫也无法阻止读取整个excel数据,它仍然会消耗大量时间和内存。您在处理此问题方面有丰富的经验吗?
答案 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()
快速获取几行或几列,内存不知道。