django上传文件,处理pandas并下载为csv

时间:2017-04-26 13:02:58

标签: python django csv pandas

我构建了一个允许用户上传文件的应用。 另一方面, 我有一些python脚本,它接受一个文本文件,将其转换为CSV并做pandas。在终端中运行时,此脚本可以正常运行。 现在我想将这个python脚本应用到Django中的文件上传中,并在httpResponse中显示该文件并可以下载它。

python脚本

import csv
import pandas as pd

df = pd.read_csv('raw_df.txt', delimiter = '\t' , usecols=['Sample','Cohort','Metabolite Name','Intensity'])
df = df[df['Cohort'].str.contains("std")]
df = df.groupby(['Cohort', 'Metabolite Name'])['Intensity'].sum().reset_index()
df = df[['Cohort','Intensity']]
c = 'Cohort'
s = df.set_index([c, df.groupby(c).cumcount() + 2]).Intensity
df =    s.unstack().add_prefix('Intensity').reset_index()
df.to_csv()
print df;

views.py

    from django.shortcuts import render, redirect
from django.conf import settings
from django.core.files.storage import FileSystemStorage

from uploads.core.models import Document
from uploads.core.forms import DocumentForm


def home(request):
    documents = Document.objects.all()
    return render(request, 'core/home.html', { 'documents': documents })

def model_form_upload(request):
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('home')
    else:
        form = DocumentForm()
    return render(request, 'core/model_form_upload.html', {
        'form': form
    })

Models.py

class Document(models.Model):
document = models.FileField(upload_to='documents/')

模板上传页面

   {% extends 'base.html' %}

{% block content %}
  <form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Upload</button>
  </form>

  <p><a href="{% url 'home' %}">Return to home</a></p>
{% endblock %}

1 个答案:

答案 0 :(得分:0)

  1. 使用方法包装文件处理:

    import csv
    import pandas as pd
    
    def process_file(file_handle):
        df = pd.read_csv(file_handle, delimiter = '\t' , usecols['Sample','Cohort','Metabolite Name','Intensity'])
        df = df[df['Cohort'].str.contains("std")]
        df = df.groupby(['Cohort', 'Metabolite Name'])['Intensity'].sum().reset_index()
        df = df[['Cohort','Intensity']]
        c = 'Cohort'
        s = df.set_index([c, df.groupby(c).cumcount() + 2]).Intensity
        df =    s.unstack().add_prefix('Intensity').reset_index()
        return df.to_csv()
    
  2. 在您的观点中:

    ... 
    if form.is_valid():
    document = form.save()
    # call to the new method
    csv = process_file(document.document)
    response = HttpResponse(csv, content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename=result.csv'
    return response
    ...