如何在Flask中将上传的CSV文件转换为指定格式的二维列表?
Flask上传文件转指定结构二维列表解决方案
嘿,我来帮你搞定这个问题!先梳理下你的场景:
你正在开发一个Flask项目,已经实现了从MySQL导出.csv文件供下载的功能,示例CSV内容大概是这样的:
1,17.0,46.0,2.80696,0.559892,0.534016,0.543017,24.25,22:30:00,2020-04-28 2,17.0,47.0,2.80884,0.559142,0.534016,0.537016,24.5,23:00:00,2020-04-28 3,16.0,53.0,2.80921,0.547517,0.534016,0.537016,24.5,23:30:00,2020-04-28 4,16.0,49.0,2.80959,0.548079,0.534016,0.537016,24.25,00:00:00,2020-04-29
现在你的服务器/upload路由支持文件上传,但目前只会返回纯文本内容,你想把这些纯文本转换成指定结构的二维列表,试了几种方法都没成功,当前的路由代码是这样的:
@app.route('/upload',methods = ['POST']) def upload_route_summary(): if request.method == 'POST': f = request.files['fileupload'] fstring = f.read() return fstring的内容
问题根源&解决方案
你当前的代码里,f.read()返回的是字节串(bytes类型),而且直接返回纯文本没有做解析。下面给你两种可行的方案,优先推荐第一种,因为能处理CSV的各种边缘情况:
方案1:用Python内置csv模块(推荐,稳!)
csv模块是Python官方专门用来处理CSV文件的工具,能自动处理字段含逗号、换行符等特殊情况,代码修改如下:
from flask import Flask, request, jsonify import csv from io import StringIO @app.route('/upload', methods=['POST']) def upload_route_summary(): if request.method == 'POST': f = request.files['fileupload'] # 第一步:把字节串解码成字符串,编码要和上传文件一致,一般是utf-8,Windows生成的可能是gbk file_content = f.read().decode('utf-8') # 第二步:用StringIO把字符串转成类文件对象,让csv模块能直接读取 csv_buffer = StringIO(file_content) # 第三步:用csv.reader解析成二维列表 csv_reader = csv.reader(csv_buffer) data_list = list(csv_reader) # 可以直接返回二维列表,或者转成JSON返回(前端更友好) return jsonify(data_list)
方案2:手动分割(适合格式绝对简单的场景)
如果你的CSV内容绝对不会出现字段含逗号、引号的情况,也可以手动分割字符串,代码更简洁:
from flask import Flask, request, jsonify @app.route('/upload', methods=['POST']) def upload_route_summary(): if request.method == 'POST': f = request.files['fileupload'] # 解码成字符串 file_content = f.read().decode('utf-8') # 按行分割,去掉首尾空白行 lines = file_content.strip().split('\n') # 每行按逗号分割成子列表,组成二维列表 data_list = [line.split(',') for line in lines] return jsonify(data_list)
注意事项
- 编码问题:一定要确认上传文件的编码,比如Windows默认生成的CSV是
gbk,如果解码报错,可以试试decode('gbk')或者decode('utf-8-sig')(处理带BOM的UTF-8文件)。 - 返回格式:用
jsonify返回JSON格式比返回字符串更适合前端处理,能直接解析成JS数组。 - 边缘情况:如果你的CSV里有带引号的字段(比如
"张三,李四",25),手动分割会出错,所以务必优先用csv模块。
内容的提问来源于stack exchange,提问作者Javier Solis
相关产品推荐
相关产品推荐

