使用Pandas读取压缩Excel文件时遇UnsupportedOperation: seek错误求解决
解决Pandas读取压缩Excel文件时的UnsupportedOperation: seek错误
这个问题的核心在于zipfile.ZipFile.open()返回的文件对象不支持seek操作,而Pandas在读取Excel文件前,会尝试调用seek(0)来检测文件类型(比如区分Excel和ODS格式),这就直接触发了报错。
解决方法:将压缩内的文件转为可seek的内存流
我们可以先把zip包内的Excel文件内容完整读取到内存,再用io.BytesIO包装成支持seek操作的对象,之后再交给pd.read_excel()处理。修改后的代码如下:
import pandas as pd import zipfile from urllib.request import urlopen import io url = 'https://www.cftc.gov/files/dea/history/fut_disagg_xls_2020.zip' # 下载zip文件到内存中的BytesIO对象 zip_buffer = io.BytesIO(urlopen(url).read()) with zipfile.ZipFile(zip_buffer) as zip_ref: # 获取zip内第一个文件的名称 excel_filename = zip_ref.namelist()[0] # 读取该文件的全部内容到新的BytesIO(支持seek) excel_buffer = io.BytesIO(zip_ref.read(excel_filename)) # 正常读取Excel文件 df = pd.read_excel(excel_buffer) # 验证结果 print(df.head())
为什么这样能解决问题?
zip_ref.open()返回的ZipExtFile是一个顺序流,只能向前读取,不支持seek()、tell()等随机访问操作;zip_ref.read(excel_filename)会把文件的全部内容一次性加载到内存,再用io.BytesIO包装后,就变成了一个支持随机访问的内存流,完全满足Pandas对输入流的要求。
内容的提问来源于stack exchange,提问作者mch56
相关产品推荐
相关产品推荐

