读取压缩包内多份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
相关产品推荐
相关产品推荐

