从URL读取Excel数据集遇ValueError:需手动指定引擎的技术求助
解决
ValueError: Excel file format cannot be determined问题 问题根源分析
你遇到的错误来自三个核心问题:
- 在线URL并非直接Excel文件链接:你使用的data.world URL指向网页界面,而非文件的直接下载地址,
requests.get获取到的是HTML内容而非Excel二进制数据,导致pandas无法识别文件格式。 - 本地文件读取逻辑错误:上传xls/xlsx文件时,代码错误调用
pd.read_csv,且未指定Excel读取引擎,会引发格式识别问题。 - 缺少Excel依赖引擎:pandas读取Excel文件需要
xlrd(针对xls格式)或openpyxl(针对xlsx格式)库,若未安装或未指定引擎,也会触发该错误。
解决方案
1. 安装必要依赖
执行以下命令安装Excel读取所需依赖:
pip install xlrd openpyxl
2. 修复在线数据获取
替换为文件的直接下载链接(可通过data.world页面的「Download」按钮获取真实地址),确保请求返回二进制文件内容。
3. 修复本地文件读取逻辑
根据上传文件的后缀名,动态选择读取方法,并指定对应的Excel引擎。
修改后的完整代码
import streamlit as st import plotly.express as px import pandas as pd import requests import os from io import BytesIO import warnings warnings.filterwarnings('ignore') import plotly.figure_factory as ff # 文件上传模块 fl = st.file_uploader(":file_folder: Upload a file", type=("csv","txt","xlsx","xls")) if fl is not None: filename = fl.name st.write(filename) # 根据文件后缀选择读取方式 if filename.endswith(('.csv', '.txt')): df = pd.read_csv(fl, encoding="ISO-8859-1") elif filename.endswith(('.xlsx', '.xls')): # 按格式指定引擎:xls用xlrd,xlsx用openpyxl engine = 'xlrd' if filename.endswith('.xls') else 'openpyxl' df = pd.read_excel(fl, engine=engine) else: # 使用文件直接下载链接 url = "https://download.data.world/missdataviz/superstore-2021/Sample+-+Superstore.xls" response = requests.get(url) if response.status_code == 200: source_data = response.content # 指定xls格式对应的引擎 df = pd.read_excel(BytesIO(source_data), engine='xlrd') else: st.error("无法获取在线数据,请检查链接有效性")
关键改动说明
- 本地读取优化:通过后缀判断读取方法,避免用csv逻辑读取Excel文件,同时明确指定引擎。
- 在线读取修复:替换为直接下载链接,确保获取到真实的Excel二进制数据,补充请求状态检查避免崩溃。
内容的提问来源于stack exchange,提问作者Ty_Ronmi
相关产品推荐
相关产品推荐

