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

从URL读取Excel数据集遇ValueError:需手动指定引擎的技术求助

解决ValueError: Excel file format cannot be determined问题

问题根源分析

你遇到的错误来自三个核心问题:

  1. 在线URL并非直接Excel文件链接:你使用的data.world URL指向网页界面,而非文件的直接下载地址,requests.get获取到的是HTML内容而非Excel二进制数据,导致pandas无法识别文件格式。
  2. 本地文件读取逻辑错误:上传xls/xlsx文件时,代码错误调用pd.read_csv,且未指定Excel读取引擎,会引发格式识别问题。
  3. 缺少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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:05:17