15

我正在用 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

如果您对此有任何想法,请提出您的建议。提前致谢。

4

5 回答 5

19

这适用于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)
于 2017-01-28T15:04:45.340 回答
13

无需在文件上调用 open,它已经打开了。您应该能够将其直接传递到 DictReader。

于 2012-05-16T11:50:47.797 回答
11

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

你可以尝试这样的事情:

paramFile = request.FILES['uploadFile'].read()
portfolio = csv.DictReader(paramFile)
于 2012-05-16T11:19:42.437 回答
9

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
     .....
     .....

详细的文章在这里 ->来源

于 2018-07-12T18:13:39.980 回答
1

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

这行得通吗?

    if form.is_valid():
        request.FILES['uploadFile'].open("rb")
        portfolio = csv.DictReader(request.FILES['uploadFile'].file)
于 2012-05-16T11:19:34.217 回答