首页 > 解决方案 > 在 Flask 中打开 csv 文件,使用 curl 作为二进制数据发送

问题描述

我正在应对一个挑战,我必须创建一个 Flask 应用程序来使用 csv 文件训练机器学习模型。使用以下 curl 命令将此 csv 文件发送到我的 Flask 应用程序:

curl \
        --silent \
        --fail \
        --data-binary @train.csv \
        --header "Content-Type: text/csv"

此 curl 命令是预定义的,因此我无法更改它以满足我的需要。另外我没有带有表单的前端组件,只有 Flask 应用程序。

我正在尝试在 Flask 中打开 train.csv 文件,但没有成功。我尝试了许多不同的方法,但没有任何效果。如何使用这个命令在 Flask 中打开这个文件?特别是作为二进制数据发送的 csv 文件,没有像这样的变量名file@train.csv

这是我尝试打开文件的一些代码片段:

# Imports
import os
from flask import Flask, jsonify, request, make_response, session
import numpy as np
import pandas as pd

app = Flask(__name__)

@app.route('/genres/train', methods=['POST'])
def train_model():
    # Check if the POST request has the file part
    #if 'file' not in request.files:
        #return jsonify({'error': 'No file part'})
  
    # Get uploaded file
    #file = request.files['file']
    file = request.get_data()

    # If user does not select file, raise error
    if file.filename == '':
        return jsonify({'error': 'No selected file'})

    # If a file has been selected and it has csv extension then it can proceed
    if file and file.filename.split('.', 1)[1].lower() == 'csv':
        #with open('test.war', 'rb') as f:
        data = pd.read_csv(file, delimiter=',')

请注意,request.files['file']我使用 Postman 来测试我的 Flask 应用程序以检查它是否有效,它确实有效。

标签: pythoncsvflaskcurl

解决方案


如果我理解你的问题,出于测试目的,你想通过命令到这个端点send/post/upload来处理文件,如果是这样,我会推荐你​​这个教程用 CURL 上传文件.csvcurl/genres/trainpandas

使用 CURL 上传文件时,很多人会误以为使用 -X POST 作为常规表单数据;事实上,这种方式会导致错误。

使用 CURL 上传文件的正确方法是使用 -F (--form) 选项,它将在请求中添加 enctype=”multipart/form-data”。

$ curl -F "NAME_FILEINPUT=@path/to/local/file" UPLOAD_ADDRESS

在您的情况下,您首先需要稍微更改代码

@app.route('/genres/train', methods=['POST'])
def train_model():

[..]

    # i assume you already have a form with a file input with "file" as parameter name
    file = request.files['file']
    # file = request.get_data()

[..]

然后试试这个命令:

$ curl -F "file=@path/to/local/file.csv" http://localhost:5000/genres/train

推荐阅读