Pandas read_excel报list index out of range错误及批量处理方案问询
报错根因
你的报错是pandas默认读取xlsx的引擎openpyxl读取样式表时索引越界,核心原因是你下载的文件实际是.xls格式,只是网站服务器错误给文件加了.xlsx后缀,文件本身没有损坏,你手动另存为.xls可正常读取也验证了这一点。
批量处理方案
方案1:读取时强制指定xls读取引擎(最简便,无需修改原文件)
直接在read_excel中指定使用xlrd引擎,该引擎专门用于读取.xls格式,不会受文件后缀名干扰:
import pandas as pd import os # 目标文件夹路径 folder_path = r'M:\PUBLIC\Felipe Dias\ONS' # 批量读取所有目标文件 for filename in os.listdir(folder_path): if filename.endswith('.xlsx'): file_path = os.path.join(folder_path, filename) df = pd.read_excel(file_path, engine='xlrd') # 后续处理逻辑写在这里
如果环境中未安装xlrd,执行pip install xlrd安装即可,高版本xlrd仅不支持.xlsx格式读取,完全适配你的场景。
方案2:批量修正文件后缀(适合需要统一文件格式的场景)
你可以通过判断二进制文件头自动识别实际格式,批量把后缀错误的.xlsx文件重命名为.xls,避免后续读取再出现兼容问题:
import os folder_path = r'M:\PUBLIC\Felipe Dias\ONS' for filename in os.listdir(folder_path): if not filename.endswith('.xlsx'): continue file_path = os.path.join(folder_path, filename) # 读取前4字节判断实际格式 with open(file_path, 'rb') as f: file_header = f.read(4) # .xls文件头为b'\xd0\xcf\x11\xe0',.xlsx为zip格式头b'PK\x03\x04' if file_header == b'\xd0\xcf\x11\xe0': new_filename = f"{os.path.splitext(filename)[0]}.xls" os.rename(file_path, os.path.join(folder_path, new_filename))
方案3:通用兼容读取函数(适合文件夹内同时存在真.xlsx和格式错误文件的场景)
如果你的文件夹内既有真实的.xlsx文件,也有后缀错误的文件,可以写自动兼容的读取函数,自动尝试不同引擎:
import pandas as pd def read_excel_compatible(file_path, **kwargs): # 先尝试读取标准.xlsx格式 try: return pd.read_excel(file_path, engine='openpyxl', **kwargs) # 读取失败则尝试用xls引擎读取 except Exception: return pd.read_excel(file_path, engine='xlrd', **kwargs) # 调用示例 df = read_excel_compatible(r'M:\PUBLIC\Felipe Dias\ONS\DIARIO_16-11-2021.xlsx')
内容的提问来源于stack exchange,提问作者femdias
相关产品推荐
相关产品推荐

