简体   繁体   English

Python Flask - 将文件上传到Pandas

[英]Python Flask - Uploading file to Pandas

I'm pretty new to Pandas and Flask, trying to leverage it to output a summarised version of a CSV containing survey feedback that I can email to users periodically. 我对Pandas和Flask很新,试图利用它来输出包含调查反馈的CSV的摘要版本,我可以定期向用户发送电子邮件。

As a standalone function, it works so long as I give it an input file that's specified (eg 'users/sample.csv') and outfile but when running as part of an application and using an uploaded html file, it fails with TypeError: csuppfb() takes at least 2 arguments (0 given) 作为一个独立的函数,它只要我给它一个指定的输入文件(例如'users / sample.csv')和outfile,但是当作为应用程序的一部分运行并使用上传的html文件时,它就会失败并伴随TypeError: csuppfb()至少需要2个参数(给定0)

Essentially I want to pass the uploaded file to the function, and have Pandas do its thing but it doesn't get that far. 基本上我想将上传的文件传递给函数,让Pandas做它的事情,但它没有那么远。 Below is the code: 以下是代码:

import re,os
import beatbox
import pandas as pd
import numpy as np
import argparse
from jinja2 import Environment, FileSystemLoader
from weasyprint import HTML
from os.path import isfile,join
from flask import Flask, request, redirect, url_for,render_template,json as fjson,send_from_directory
from werkzeug import secure_filename
from mapping import Autotagging,Manualtagging
from defs import *

UPLOAD_FOLDER = './uploads'
PIVOT_FOLDER = './pivot'
ALLOWED_EXTENSIONS = set(['csv'])

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['PIVOT_FOLDER']= PIVOT_FOLDER

@app.route('/feedback',methods=['GET', 'POST'])
def feedback():
    if request.method == 'POST':
        file = request.files['file']
        if file and allowed_file(file.filename):
            filename = randomword(6)+'_'+secure_filename(file.filename)
            file.save(os.path.join(app.config['PIVOT_FOLDER'], filename))
            return redirect(url_for('csuppfb',df=filename))

    return render_template('mappingtest.html')

@app.route('/csuppfb', methods=['POST','GET'])
def csuppfb(df,infile, index_list=["Case Owner","Case Number","Support Survey - Service rating"], value_list = ["Age (Hours)"]):
    """
    Creating a pivot table from the raw dataframe and returning it as a dataframe
    """
    table = pd.pivot_table(df, index=index_list, values = value_list, 
                    aggfunc=[np.sum,np.mean], fill_value=0)
    return table

def get_summary_stats(df, product):
    """
    Get a stats summary 
    """
    results.append(df[df["Support Survey - Service rating"]==product]["Closed"].mean())
    results.append(df[df["Support Survey - Service rating"]==product]["Age (Hours)"].mean())
    return results

def dataform(df):
    """
    Take the dataframe and output it in html to output a pdf report or display on a web page
    """
    df = pd.read_csv(filename)
    csuppreport = pivot_table(df,filename)
    agent_df = []
    for agent in csuppreport.index.get_level_values(0).unique():
        agent_df.append([agent, csuppreport.xs(agent, level=0).to_html()])
    env = Environment(loader=FileSystemLoader('.'))
    template = env.get_template("csupp.html")


template_vars={"title": "CSUPP FB REPORT", 
            "Excellent": get_summary_stats(df,"Excellent"),
            "Good": get_summary_stats(df,"Good"),
            "csupp_pivot_table": csuppreport.to_html(),
            "agent_detail": agent_df}

html_out = template.render(template_vars)
HTML(string=html_out).write_pdf(args.outfile.name,stylesheets=["style.css"])
return render_template('csupp.html')

What's the best way to have the file I've uploaded be used as the dataframe argument in def csuppfb(df,infile... ? 将我上传的文件用作def csuppfb中的dataframe参数的最佳方法是什么(df,infile ......?

Any advice would be very much appreciated. 任何建议将非常感谢。 I've a feeling it's something glaringly obvious I'm missing. 我有一种感觉,我很遗憾,这是显而易见的。

you need to use the args object from request which contains all the url params http://flask.pocoo.org/docs/0.10/quickstart/#the-request-object 您需要使用来自请求的args对象,其中包含所有url参数http://flask.pocoo.org/docs/0.10/quickstart/#the-request-object

See this basic example: 看到这个基本的例子:

@app.route('/csuppfb', methods=['POST','GET'])
    def csuppfb():
        if request.args['df'] :
            df = request.args['df']
            #Do your panda stuff here. Instead of returning the filename :D
            return str(df)
        else :
            return 'nofile'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM