pandas读取XLS文件出现:WARNING *** OLE2 inconsistency: SSCS size is 0 but SSAT size is non-zero

有时在使用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

欢迎批评指正。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值