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

Naz*_*een 12 python csv django file-upload 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)
Run Code Online (Sandbox Code Playgroud)

下面这行给出了错误.

paramFile = open(request.FILES['uploadFile'], 'rb')
Run Code Online (Sandbox Code Playgroud)

给定的错误是:

TypeError: coercing to Unicode: need string or buffer, InMemoryUploadedFile found
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*hyn 16

这适用于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)
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 10

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


Sho*_*obi 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
     .....
     .....
Run Code Online (Sandbox Code Playgroud)

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


zub*_*hta 8

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

你能尝试这样的事吗:

paramFile = request.FILES['uploadFile'].read()
portfolio = csv.DictReader(paramFile)
Run Code Online (Sandbox Code Playgroud)

  • 我收到此错误:_csv.Error:迭代器应返回字符串,而不是int(您是否以文本模式打开文件?) (4认同)