【问题标题】:django upload file, process pandas and download as csvdjango 上传文件,处理 pandas 并下载为 csv
【发布时间】:2017-04-26 13:02:57
【问题描述】:

我构建了一个允许用户上传文件的应用程序。 另一方面, 我有一些 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
    })

模型.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 %}

【问题讨论】:

    标签: python django csv pandas


    【解决方案1】:
    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
      ...
      

    【讨论】:

    • 执行此操作后出现 IOError: File file_handle does not exist.
    • 请调试:确保 document.document 不是 None 并且它有一个 read() 方法。根据pandas documentationread_csv()应该支持FileField
    • 您好,我只尝试了稍微不同的文件输入(文本文件)并以不同的方式处理:def process_file(f): file=open(f, "r"); x=file.read(); ..... new_file=open("result.txt", "w"); return(new_file.write(x)); file.close() 其他一切都完全相同,我收到文件不正确的错误...无效文件:&lt;FieldFile: documents/polymer_model_LtcOE0j.txt&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2011-08-15
    • 2021-08-25
    相关资源
    最近更新 更多