将Flask上传的文件读入pandas dataframe

时间:2017-07-23 22:25:26

标签: python pandas flask pythonanywhere

我正在尝试使用Python 2.7在PythonAnywhere上创建一个Flask Web应用程序,允许用户上传csv文件,然后将该文件读入pandas数据帧进行处理。该程序使用了我尝试过的一个csv文件,但没有使用其他文件。该程序似乎上传文件正常,但抛出一条错误消息#012IOError: File xyz.csv does not exist。这是代码的相关部分:

from flask import Flask, make_response, request, send_file
import pandas as pd

# Initialize the Flask application
app = Flask(__name__)

@app.route('/')
def form():
    return """
        <html>
            <body>
                <h1>YDNA Kit Grouping Program</h1>

                <form action="/main_program" method="post" enctype="multipart/form-data">
                    <input type="file" name="input_file" />
                    <input type="submit" />
                </form>
            </body>
        </html>
    """

@app.route('/main_program', methods=["POST"])
def main_program_view():

    # Input file
    file = request.files['input_file']
    if not file:
        return "No file"

    # Put input file in dataframe
    df = pd.read_csv(file.filename, encoding='cp1252')

我认为问题可能出在file.filename未提供pd.read_csv所需的文件位置信息的最后一行代码中。但我不知道为什么它适用于一个csv文件而不是另一个csv文件并且不知道如何修复它以便它可以将任何上传的csv文件读入数据帧。

1 个答案:

答案 0 :(得分:3)

PythonAnywhere员工能够指出我正确的解决方案。 pandas read_csv函数似乎需要一个path参数来读取csv文件。但是,由于所有相当小的Flask文件上传都存储在网络服务器的内存中,因此除非您将它们保存在某处,否则它们不会有路径。解决方案是将文件保存到Flask临时文件位置(或永久文件位置),然后使用保存文件的路径作为read_csv函数的路径参数:

import tempfile
tempfile_path = tempfile.NamedTemporaryFile().name
file.save(tempfile_path)
sheet = pd.read_csv(tempfile_path)