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

Flask应用条件分支异常:输入有效年份时else代码块无法执行导致预测功能失效求助

问题排查与修复方案

你的核心问题出在条件判断的逻辑错误和类型不匹配上,导致正确的年份永远无法进入else分支。让我一步步拆解并修复:

1. 错误根源分析

你代码里的这段判断存在两个致命问题:

elif year != 2013 or year != 2014 or year != 2015 or year != 2016 or year != 2017 or year != 2018:
  • 类型不匹配:request.form['value']获取到的是字符串类型,而你直接和整数2013等比较,永远不会相等——比如"2013" != 2013的结果是True。
  • 逻辑运算符错误:用or的话,任何年份都会满足这个条件——比如输入2013时,year !=2014是True,整个or表达式就为True,所以永远进入错误提示分支。正确的逻辑应该是用and,或者更简洁的“判断年份不在指定集合中”。

2. 修复后的完整代码

我修正了条件判断,同时加上了类型转换的异常处理(防止用户输入非数字内容)、文件存在性检查,让代码更健壮:

from flask import Flask,render_template,url_for,request,redirect
import pandas as pd
import pickle

# 加载预训练模型
loaded_model=pickle.load(open('pickle-files/RandomForestRegressor.pkl', 'rb'))
app = Flask(__name__)

@app.route('/',methods = ['POST', 'GET'])
def home():
    if request.method == 'POST':
        year_str = request.form['value'].strip()
        if not year_str:
            return render_template('home.html')
        
        # 处理类型转换,拦截非数字输入
        try:
            year = int(year_str)
        except ValueError:
            return render_template('home.html', num = '请输入有效的数字年份')
        
        # 用集合判断年份是否在有效范围内
        valid_years = {2013,2014,2015,2016,2017,2018}
        if year not in valid_years:
            return render_template('home.html', num = '你输入的年份不在指定范围内,请输入2013-2018之间的年份')
        else:
            try:
                # 读取对应年份的数据文件
                df=pd.read_csv(f'Data/Real-Data/real_{year}.csv')
                # 确保输入数据不为空
                if df.iloc[:,:-1].empty:
                    return render_template('home.html', num = '该年份没有可用的有效数据')
                
                # 执行预测并返回结果
                my_prediction=loaded_model.predict(df.iloc[:,:-1].values)
                my_prediction=my_prediction.tolist()
                return render_template('home.html', prediction = my_prediction)
            except FileNotFoundError:
                return render_template('home.html', num = f'找不到年份{year}对应的数据文件')
            except Exception as e:
                return render_template('home.html', num = f'预测过程出错:{str(e)}')
    else:
        return render_template('home.html')

if __name__ == '__main__':
    app.run(debug=True)

3. 额外的服务器端检查点

除了代码修复,你还需要确认服务器上的以下内容:

  • pickle-files/RandomForestRegressor.pkl文件路径正确,且服务器进程有读取权限。
  • Data/Real-Data/real_{year}.csv文件确实存在(比如real_2013.csv),注意相对路径是相对于Flask应用的启动目录。
  • 确保CSV文件的列结构和模型训练时的输入结构完全一致,避免预测时因特征不匹配报错。

内容的提问来源于stack exchange,提问作者Anil Dhage

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:22:30