Skip to main content
 首页 » 编程设计

python之Django 上传和处理没有数据保留的文件

2025年05月04日39小虾米

python :2.7.11

Django :1.9

我想将一个 csv 文件上传到 Django 并使用 Python 类对其进行分析。不允许保存,文件只需要到达要分析的类。我正在为表单使用 Dropzone.js,但我不明白我应该如何配置/编程 View 来实现这一点。

<form action="/upload/" method="post" enctype="multipart/form-data" class="dropzone" id="dropzone"> 
    {% csrf_token %} 
    <div class="fallback"> 
        <input name="file" type="file" multiple /> 
    </div> 
</form> 

我找到了一个 article关于这个,但它描述了保存并且基于 Django 1.5。

View .py

def upload(request): 
    if request.method == 'POST': 
        file = FileUploadForm(request.POST) 
        if file.is_valid(): 
            return HttpResponseRedirect('/upload/') 
    else: 
        file = FileUploadForm() 
 
    return render(request, 'app/upload.html', {'file': file}) 

表单.py

from django import forms 
class FileUploadForm(forms.Form): 
    file = forms.FileField() 

结束更新: 帮助答案和我的情况之间最重要的区别是我必须解码我的输入。 在 handle_csv_data 中查看以下行作为我的 csv_file:

StringIO(content.read().decode('utf-8-sig')) 

请您参考如下方法:

在 View 函数中访问csv文件。如果您使用的是 python 3,则必须将 InMemoryUploadedFile 包装在 TextIOWrapper 中,以便使用 csv 模块对其进行解析。

在此示例中,csv 被解析并作为名为“content”的列表传回,该列表将显示为表格。

views.py

import csv 
import io  # python 3 only 
 
def handle_csv_data(csv_file): 
    csv_file = io.TextIOWrapper(csv_file)  # python 3 only 
    dialect = csv.Sniffer().sniff(csv_file.read(1024), delimiters=";,") 
    csv_file.seek(0) 
    reader = csv.reader(csv_file, dialect) 
    return list(reader) 
 
 
def upload_csv(request): 
    csv_content=[] 
    if request.method == 'POST': 
        csv_file = request.FILES['file'].file 
        csv_content = handle_csv_data(csv_file)   
    return render(request, 'upload.html', {'content':content}) 

您的原始代码没有正确使用 django 的表单框架,所以我只是从这个示例中删除了它。所以当上传的文件无效或丢失时,你应该实现错误处理。

上传.html

  <form action="/upload/"  
        method="post"  
        enctype="multipart/form-data"  
        class="dropzone"  
        id="dropzone"> 
    {% csrf_token %} 
    <div class="fallback"> 
      <input name="file" type="file"/> 
      <input type="submit"/> 
    </div> 
  </form> 
  {% if content %} 
  <table> 
  {% for row in content %} 
    <tr> 
    {% for col in row %} 
      <td>{{ col }}</td> 
    {% endfor %} 
    </tr> 
  {% endfor %} 
  </table> 
  {% endif %} 

我添加了一个“提交”按钮,这样就可以在没有 dropzone 的情况下工作。我还从文件输入中删除了“多个”,以保持示例简单。如果模板从解析的 csv 中接收内容,最后会有一个表格。但是当使用dropzone.js时,你必须使用javascript回调函数来显示表格。