Flask应用加载CSV时数字字符串转float失败,求助排查
问题分析与解决方案
你的核心问题是CSV文件的分隔符不匹配:从错误信息里的字符串'142.2;480;1054;...'可以看出,你的CSV实际用分号(;)作为字段分隔符,但代码里设置的是逗号(delimiter=',')。这导致csv.reader把整行内容当成单个字符串,QUOTE_NONNUMERIC自然无法将其转换为float类型。
另外代码里还有一个小错误:你已经从flask导入了request,但调用时写成了flask.request,会导致NameError,需要修正为request。
修改后的代码
from flask import Flask, jsonify, render_template, request import csv import codecs app = Flask(__name__) @app.route("/submit", methods=["POST"]) def submit(): file = request.files["data_file"] if not file: return "No file submitted" data = [] stream = codecs.iterdecode(file.stream, encoding='utf-8-sig') # 将分隔符改为分号,匹配CSV实际格式 for row in csv.reader(stream, delimiter=';', quoting=csv.QUOTE_NONNUMERIC, dialect="excel"): data.append(row) return jsonify(data) if __name__ == "__main__": app.run(host='0.0.0.0', debug=True)
更灵活的方案:自动检测分隔符
如果不确定CSV的分隔符,可以用csv.Sniffer自动探测,适配不同格式的CSV文件:
@app.route("/submit", methods=["POST"]) def submit(): file = request.files["data_file"] if not file: return "No file submitted" data = [] stream = codecs.iterdecode(file.stream, encoding='utf-8-sig') # 自动探测CSV方言(包括分隔符) sample = stream.read(1024) dialect = csv.Sniffer().sniff(sample) stream.seek(0) # 重置流指针到文件开头 for row in csv.reader(stream, dialect=dialect, quoting=csv.QUOTE_NONNUMERIC): data.append(row) return jsonify(data)
内容的提问来源于stack exchange,提问作者Nicolás
相关产品推荐
相关产品推荐

