python读取超大(Gb级别)的excel

使用pandas的read_excel读取,耗时巨大,而且不适合作为调试工具,这里使用openpyxl,用它的只读模式,可以 即时 读取任何单元格的内容,先上代码:
import openpyxl
file = big_excel.xlsx
# 必须是只读模式,否则也是很慢
wb = openpyxl.load_workbook(file,read_only=True) 

sht = wb[Sheet1]
# 从第2行5列读起,data就是一行的数据。注意,excel的第一行第一列是(1,1),而非(0,0)
for datas in sht.iter_rows(min_row=2,min_col=5): 
	col_size = len(datas)
	for i in range(col_size):
		cell_value = datas[i].value
千万千万要注意的,不要使用sht.cell(row,column)定位单元格,否则数据量非常大,非常慢,内存瞬间爆满,程序卡住。可以用以下方式先读取表头和行头

读取数据同时包含表头行头

正确写法

# 读取表头,假设表头是从第2行第2列开始
row_datas = []
for datas in sht.iter_rows(min_row=2,min_col=2,max_row=2):#只读取第二行
	for i in range(len(datas)):
		value = datas[i].value
		row_datas.append(value)

# 读取行头,假设内容从第3行第1列开始
col_datas = []
for datas in sht.iter_rows(min_row=3,min_col=1,max_col=1):
	for i in range(len(datas)):
		value = datas[i].value
		col_datas.append(value)

# 读取数据的同时显示表头和列头数据
for datas in sht.iter_rows(min_row=3,min_col=2):
	row_num = datas[0].row
	for i in range(len(datas)):
		cell_value = datas[i].value
		col_header = col_datas[i] # 列头
		row_header = row_datas[row_num-3] #行头
		
		# 这个也是正确写法
		# col_num = datas[i].column
		# col_header = col_datas[col_num-2]

错误写法

看起来比上面代码量少,实际上对于大的文件没法用
for datas in sht.iter_rows(min_row=3,min_col=2):
	row_num = datas[0].row
	for i in range(len(datas)):
		cell_value = datas[i].value
		col_num = datas[i].column

		# 以下2行代码导致读起来极其慢,而且内存瞬间爆满
		row_header = sht.cell(row_num,2)
		col_header = sht.cell(3,col_num)
经验分享 程序员 微信小程序 职场和发展