You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取压缩包内多份Excel文件遇UnsupportedOperation: seek错误求解决方案

解决UnsupportedOperation: seek错误:读取压缩包内多份Excel文件

这个错误我之前处理过,核心原因是:zipfile.ZipFile.open()返回的是一个只能顺序读取的文件对象,不支持seek()操作,但pandas.read_excel()依赖的Excel解析库(比如openpyxl、xlrd)需要随机访问文件内容,所以直接用zf.open(f)传给read_excel()就会报错。

下面给你两种可行的解决方案:

方案1:用BytesIO包装文件内容(推荐,无需解压到磁盘)

把压缩包里的Excel文件内容读取到io.BytesIO对象中,这个对象模拟了可seek的文件接口,完美适配pandas:

import pandas as pd
import zipfile
import glob
from io import BytesIO

df = pd.DataFrame()
# 遍历找到的zip文件
for zip_file in glob.glob("/content/drive/My Drive/file.zip"):
    # 用with语句自动管理zip文件的打开/关闭
    with zipfile.ZipFile(zip_file) as zf:
        # 遍历压缩包内的所有文件
        for f in zf.namelist():
            # 只处理Excel格式的文件,过滤掉非xlsx/xls的内容
            if f.lower().endswith(('.xlsx', '.xls')):
                print(f"正在读取: {f}")
                # 读取文件的二进制内容,用BytesIO包装成可seek的对象
                excel_buffer = BytesIO(zf.read(f))
                # 正常读取Excel
                dfs = pd.read_excel(excel_buffer)
                # 合并到总DataFrame
                df = pd.concat([df, dfs], ignore_index=True)

为什么这个方法管用?

zf.read(f)会直接把文件的全部二进制内容读入内存,BytesIO把这些内容封装成一个支持随机访问(也就是seek操作)的类文件对象,刚好满足pd.read_excel()的要求。而且不需要把文件解压到磁盘,效率更高。

方案2:先解压到临时目录再读取

如果你的压缩包特别大,或者需要保留解压后的文件,可以用临时目录来中转:

import pandas as pd
import zipfile
import glob
from tempfile import TemporaryDirectory

df = pd.DataFrame()
for zip_file in glob.glob("/content/drive/My Drive/file.zip"):
    with zipfile.ZipFile(zip_file) as zf, TemporaryDirectory() as temp_dir:
        for f in zf.namelist():
            if f.lower().endswith(('.xlsx', '.xls')):
                # 把文件解压到临时目录
                extracted_file = zf.extract(f, temp_dir)
                print(f"正在读取解压后的文件: {extracted_file}")
                dfs = pd.read_excel(extracted_file)
                df = pd.concat([df, dfs], ignore_index=True)

优势

  • TemporaryDirectory会在代码块执行完后自动删除所有临时文件,不用手动清理垃圾。
  • 适合处理超大Excel文件,避免一次性把文件内容加载到内存导致内存溢出。

小提示

  • 如果你的Excel文件有多个工作表,可以在pd.read_excel()里加上sheet_name参数指定要读取的表(比如sheet_name=0读第一个表,sheet_name="Sheet1"读指定名称的表)。
  • 记得检查压缩包内的文件路径有没有特殊字符,避免读取时出现路径错误。

内容的提问来源于stack exchange,提问作者Sarim Nabi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:17:49