有时在使用pandas读取XLS文件时,会出现"WARNING *** OLE2 inconsistency: SSCS size is 0 but SSAT size is non-zero"警告。
伴随着此警告有时还会遇到一个非常严重的问题,及无法获取XLS文件中的数据,会显示
Empty DataFrame
Columns: []
Index: []
此问题原因:当读取XLS文件时,系统获取到的文件属性,如行数、列数为0,但是实际上文件中的行数、列数不为零,而系统按照其获取的0行、0列的属性遍历并读取文件,是无法获取全部数据的。
解决办法:使用xlrd模块打开XLS文件,并从零开始,索引以此递增逐行读取数据,直至报出"list index out of range"错误,在此过程中获取XLS文件真实行数和列数,并根据真实行数和列数获取XLS文件数据。
import pandas as pd
import xlrd
import numpy as np
def read_xls(file_name):
"""解决读取XLS文件出现警告,并且无法获取数据的问题"""
data_xls = xlrd.open_workbook(file_name)
sheet_name_list = data_xls.sheet_names()
data_all = {}
for sheet_name in sheet_name_list:
'''1、获取XLS表中真实行数和列数'''
data_sheet = data_xls.sheet_by_name(sheet_name)
nrows = 1
ncols = 0
while 1:
try:
data_row = data_sheet.row_values(nrows)
except:
break
else:
nrows = nrows + 1
ncols = max(ncols, len(data_row))
'''2、生成columns,定义一个data_new二维列表,存储单个sheet中所有数据'''
data_row_0 = data_sheet.row_values(0)
# columns 为XLS文件第一行
columns = data_row_0 + ['Unnamed:' + str(i) for i in range(1, ncols - len(data_row_0) + 1)]
data_new = []
'''3、遍历每行,每行的长度低于ncols时,自动并自动补充nan'''
for row_i in range(1, nrows):
data_row_i = data_sheet.row_values(row_i)
# 当表格中有行合并时,获取此行数据时:
# 参与合并的单元格中最左边单元个内容 = 合并单元格中内容
# 其他参与合并的单元个为空或者不显示,因此这些单元格填充为np.nan
# 保证每行的长度=列数
data_row_i = [np.nan if j == "" else j for j in data_row_i]
data_row_i_supplement = data_row_i + [np.nan] * (ncols - len(data_row_i))
data_new.append(data_row_i_supplement)
'''4、生成dataframe'''
data_f = pd.DataFrame(data_new, columns=columns)
data_all[sheet_name] = data_f
return data_all
欢迎批评指正。