簡體   English   中英

Python Flask - 將文件上傳到Pandas

[英]Python Flask - Uploading file to Pandas

我對Pandas和Flask很新,試圖利用它來輸出包含調查反饋的CSV的摘要版本,我可以定期向用戶發送電子郵件。

作為一個獨立的函數,它只要我給它一個指定的輸入文件(例如'users / sample.csv')和outfile,但是當作為應用程序的一部分運行並使用上傳的html文件時,它就會失敗並伴隨TypeError: csuppfb()至少需要2個參數(給定0)

基本上我想將上傳的文件傳遞給函數,讓Pandas做它的事情,但它沒有那么遠。 以下是代碼:

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')

將我上傳的文件用作def csuppfb中的dataframe參數的最佳方法是什么(df,infile ......?

任何建議將非常感謝。 我有一種感覺,我很遺憾,這是顯而易見的。

您需要使用來自請求的args對象,其中包含所有url參數http://flask.pocoo.org/docs/0.10/quickstart/#the-request-object

看到這個基本的例子:

@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