Python 使用curl在Flask中打开作为二进制数据发送的csv文件

Python 使用curl在Flask中打开作为二进制数据发送的csv文件,python,csv,flask,curl,Python,Csv,Flask,Curl,我正在进行一项挑战,我必须创建一个Flask应用程序,使用csv文件来训练机器学习模型。使用以下curl命令将此csv文件发送到my Flask应用程序: curl \ --silent \ --fail \ --data-binary @train.csv \ --header "Content-Type: text/csv" 这个curl命令是预定义的,因此我无法更改它以满足我的需要。 另外,我没有带表单

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

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

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

我正在尝试打开Flask中的train.csv文件,但未成功。我试过很多不同的方法,但都不管用。如何使用此命令在Flask中打开此文件?特别是作为二进制数据发送的csv文件,没有像so
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']
被我用来测试我的Flask应用程序,使用Postman来检查它是否工作,它确实工作了。

如果我理解你的问题,出于测试目的,您希望通过
curl
命令将
发送/发布/上载
一个
.csv
文件发送到该端点
/genres/train
,以使用
熊猫
处理该文件,如果是这样,我建议您使用本教程

使用CURL上传文件时,许多人会犯错误,认为使用-X POST作为常规表单数据;事实上,这样做会导致错误

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

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

@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

如果我理解您的问题,出于测试目的,您希望通过
curl
命令将
发送/发布/上载
一个
.csv
文件发送到该端点
/genres/train
,使用
熊猫
处理该文件,如果是这样,我建议您使用本教程

使用CURL上传文件时,许多人会犯错误,认为使用-X POST作为常规表单数据;事实上,这样做会导致错误

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

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

@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

我自己设法找到了解决办法。以下是我用来读取作为二进制数据发送的csv文件的代码:

@app.route("/genres/train", methods=["POST"])
def train_model():
    # Decode the request
    data = request.data.decode("utf-8")

    # Write data from the request in a local csv file
    train_csv = "train_local.csv"
    f = open(train_csv, "w", encoding="utf-8")
    f.write(data)
    f.close()

    # Load the train csv file as a DataFrame
    train_df = pd.read_csv(train_csv)


我自己设法找到了解决办法。以下是我用来读取作为二进制数据发送的csv文件的代码:

@app.route("/genres/train", methods=["POST"])
def train_model():
    # Decode the request
    data = request.data.decode("utf-8")

    # Write data from the request in a local csv file
    train_csv = "train_local.csv"
    f = open(train_csv, "w", encoding="utf-8")
    f.write(data)
    f.close()

    # Load the train csv file as a DataFrame
    train_df = pd.read_csv(train_csv)


谢谢你的回答!我正在处理这个挑战,curl命令不是我的,它是预定义的,所以我不能更改它。我没有html格式的表单,我只有Flask应用程序,我先用Postman自己测试了一下,这就是为什么我使用了“request.files['file']”的原因。但实际上,数据是使用curl命令发送到我的Flask应用程序的,该命令将数据作为二进制数据发送,而不使用“file=filename”这样的变量名。这就是我遇到问题的地方,因为如果数据没有变量名,并且存储为二进制数据,我不知道如何访问数据。谢谢您的回答!我正在处理这个挑战,curl命令不是我的,它是预定义的,所以我不能更改它。我没有html格式的表单,我只有Flask应用程序,我先用Postman自己测试了一下,这就是为什么我使用了“request.files['file']”的原因。但实际上,数据是使用curl命令发送到我的Flask应用程序的,该命令将数据作为二进制数据发送,而不使用“file=filename”这样的变量名。这就是我遇到问题的地方,因为如果数据没有变量名,并且也存储为二进制数据,我不知道如何访问它。