打开上载的CSV文件时出现类型错误

时间:2012-05-16 11:09:01

标签: python django file-upload csv django-forms

我正在使用django在python中开发一个应用程序。用户可以上传CSV文件。我使用文件上传来获取文件。但是,它并没有存储在任何地方。我尝试从请求处理文件。当我试图打开文件时,它会出错。我使用python中存在的CSV库进行处理。根据django使用的表单元素和属性。我试图获取上传文件的请求对象也是django设计的对象。

import csv
from rootFolder.UploadFileForm

def uploadFile(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            paramFile = open(request.FILES['uploadFile'], 'rb')
            portfolio = csv.DictReader(paramFile)
            users = []
            for row in portfolio:
                users.append(row)

以下行给出错误。

paramFile = open(request.FILES['uploadFile'], 'rb')

给定的错误是:

TypeError: coercing to Unicode: need string or buffer, InMemoryUploadedFile found

如果您对此有任何疑问,请提出您的建议。 提前谢谢。

5 个答案:

答案 0 :(得分:15)

适用于 Python 3

import csv
import io

...

csv_file = request.FILES['uploadFile']
decoded_file = csv_file.read().decode('utf-8')
io_string = io.StringIO(decoded_file)
for line in csv.reader(io_string, delimiter=';', quotechar='|'):
    print(line)

答案 1 :(得分:10)

无需在文件上打开,它已经打开。你应该能够直接将它传递给DictReader。

答案 2 :(得分:8)

open()将文件名作为参数,而不是文件对象本身。

你可以尝试这样的事情:

paramFile = request.FILES['uploadFile'].read()
portfolio = csv.DictReader(paramFile)

答案 3 :(得分:3)

Django 2,Python 3.6 ,同样的问题,谷歌搜索了半天,这是对我有用的解决方案。

form.is_valid:
  csv_file = request.FILES['file']
  csv_file.seek(0)
  reader = csv.DictReader(io.StringIO(csv_file.read().decode('utf-8')))

  for row in reader
     .....
     .....

此处有详细的文字-> source

答案 4 :(得分:1)

你得到一个TypeError,因为内置函数open需要一个字符串作为文件的路径。

这有用吗?

    if form.is_valid():
        request.FILES['uploadFile'].open("rb")
        portfolio = csv.DictReader(request.FILES['uploadFile'].file)