使用Python读取Selenium下载的XLS文件时出现小端序错误求助
这种情况我之前踩过坑!Selenium下载的Excel 97-2003文件(.xls)经常会出现这种“Excel能打开,但代码读不了”的情况,根本不是编码的问题——毕竟你试了各种编码都没用,而且Excel保存后就正常了,核心原因是下载的文件不是标准的BIFF格式,可能混了额外的响应字节或者结构有轻微损坏,而Excel打开时会自动修复这些问题。
下面给你几个亲测有效的解决思路:
1. 检查并清理文件的无效头部/尾部字节
Selenium下载文件时,有时候服务器返回的响应会带一些HTTP响应头的残留字节,或者传输过程中多了些无关数据,导致解析库(比如xlrd、pandas)识别失败。标准的.xls文件开头8字节的十六进制签名是D0 CF 11 E0 A1 B1 1A E1,你可以用Python验证一下:
import binascii with open("你的下载文件.xls", "rb") as f: header = f.read(8) print(binascii.hexlify(header).upper())
如果输出不是上面的签名,那说明文件开头有多余内容。你可以尝试从正确的签名位置开始截取文件内容,再保存成新文件:
with open("下载的文件.xls", "rb") as f_in, open("修复后的文件.xls", "wb") as f_out: content = f_in.read() # 找到标准签名的起始位置 start_idx = content.find(b'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1') if start_idx != -1: f_out.write(content[start_idx:])
处理完之后再用解析库读取,大概率就能正常识别了。
2. 用能模拟Excel修复的工具读取
如果不想手动处理文件,直接调用Excel本身的修复能力是最省心的(前提是Windows环境装了Excel),用win32com.client就能实现:
import win32com.client as win32 # 启动Excel后台进程 excel = win32.gencache.EnsureDispatch('Excel.Application') excel.Visible = False # 后台运行不显示窗口 # 打开文件(Excel会自动修复) wb = excel.Workbooks.Open(r"你的下载文件路径.xls") ws = wb.Worksheets(1) # 取第一个工作表 # 示例:读取A1到C10的单元格数据 data = [] for row in range(1, 11): row_data = [] for col in range(1, 4): row_data.append(ws.Cells(row, col).Value) data.append(row_data) # 关闭文件和Excel进程 wb.Close(SaveChanges=False) excel.Quit() print(data)
这个方法和你手动打开保存的效果完全一致,Excel会自动处理文件里的异常内容。
3. 换用更兼容的解析库
有些旧版本的解析库对非标准xls文件支持不好,比如xlrd 2.0之后不再支持xls格式,你可以降级到xlrd 1.2.0版本,配合pandas读取:
import pandas as pd # 确保安装了xlrd 1.2.0:pip install xlrd==1.2.0 df = pd.read_excel("下载的文件.xls", engine='xlrd') print(df.head())
另外也可以试试pyexcel库,它对各种格式的兼容性更强:
import pyexcel as pe sheet = pe.get_sheet(file_name="下载的文件.xls") print(sheet.to_array())
总的来说,最根本的问题就是下载的文件不是完全标准的xls结构,Excel的修复机制帮你抹平了差异,你只需要在代码里模拟这个修复过程,或者提前清理掉无效内容就能解决问题啦!
内容的提问来源于stack exchange,提问作者Frostic

