Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django上传文件,以csv格式处理和下载_Python_Django_Csv_Pandas - Fatal编程技术网

Python django上传文件,以csv格式处理和下载

Python django上传文件,以csv格式处理和下载,python,django,csv,pandas,Python,Django,Csv,Pandas,我开发了一个应用程序,允许用户上传文件。 另一方面 我有一些python脚本,它接受一个文本文件,将其转换为CSV并执行一些操作。此脚本在终端中运行时工作正常。 现在,我想将该python脚本应用到Django中的文件上传,并在httpResponse中显示该文件,以便下载 python脚本 views.py from django.shortcuts import render, redirect from django.conf import settings from django

我开发了一个应用程序,允许用户上传文件。 另一方面 我有一些python脚本,它接受一个文本文件,将其转换为CSV并执行一些操作。此脚本在终端中运行时工作正常。 现在,我想将该python脚本应用到Django中的文件上传,并在httpResponse中显示该文件,以便下载

python脚本 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 %}
{%extends'base.html%}
{%block content%}
{%csrf_令牌%}
{{form.as_p}}
上传

{%endblock%}
  • 用以下方法包装文件处理:

    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()
    
  • 在你看来:

    ... 
    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:文件句柄不存在。请调试:确保
    document.document
    不是None,并且它具有
    read()
    方法。根据
    read_csv()
    应该支持
    FileField
    Hi,我只是用稍微不同的文件输入(文本文件)进行了尝试,并以不同的方式进行了处理:
    def process_file(f):file=open(f,“r”);x=文件。读取()。。。。。新建_文件=打开(“result.txt”、“w”);返回(new_file.write(x));file.close()
    其他所有内容都完全相同,我收到的错误是文件不正确。。。无效文件:
    ... 
    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
    ...