Ошибка получения типа при открытии загруженного файла CSV

Я разрабатываю приложение на python с помощью django. Пользователь может загрузить файл CSV. Я использую файл загрузки, чтобы получить файл. Но оно нигде не хранится. Я пытаюсь взять его из запроса на обработку файла. Пока я пытаюсь открыть файл, он выдает ошибку. Я использую библиотеку CSV существует в Python для обработки. Элементы формы и атрибуты, используемые в соответствии с 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)

Нет необходимости вызывать файл open, он уже открыт. Вы должны быть в состоянии передать его прямо в DictReader.

 Nazneen17 мая 2012 г., 05:58
Этот тоже отлично работает .. Большое спасибо. мы можем пройти напрямую. Этот способ кажется действительно хорошим. большое спасибо

Django 2, Python 3.6та же проблема, полдня поиска в Google, это решение, которое работало для меня.

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

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

подробное описание здесь - & gt;источник

Вы получаете TypeError, потому что встроенная функция open ожидает строку, которая является путем к файлу.

Это работает?

    if form.is_valid():
        request.FILES['uploadFile'].open("rb")
        portfolio = csv.DictReader(request.FILES['uploadFile'].file)
 Nazneen16 мая 2012 г., 13:46
Появляется та же ошибка NoneType.
 16 мая 2012 г., 13:23
Я не думаю, что у файлового объекта есть метод open ()
 Nazneen16 мая 2012 г., 13:30
Это не работает. Там написано "NoneType: None". Спасибо за предложение
 16 мая 2012 г., 14:05
Отредактированный request.FILES ['uploadFile']. File- Этот атрибут должен ссылаться на базовый объект файла python.
 16 мая 2012 г., 13:38
Отредактировал предложение. Класс InMemoryUploadedFile im дополняет метод open изdjango.core.files module

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)
Решение Вопроса

а не сам объект файла.

Можете ли вы попробовать что-то вроде этого:

paramFile = request.FILES['uploadFile'].read()
portfolio = csv.DictReader(paramFile)
 12 авг. 2017 г., 12:31
я получаю эту ошибку: _csv.Error: итератор должен возвращать строки, а не int (вы открывали файл в текстовом режиме?)
 16 мая 2012 г., 13:54
Существует метод read () согласно документации, я попробовал, это работает.
 16 мая 2012 г., 13:29
Мой плохой, но в основном идея состоит в том, чтобы получить путь к загруженному файлу. Попробуйте тот, который я только что отредактировал.
 Nazneen16 мая 2012 г., 13:34
Это дает ошибку атрибута. Я тоже пробовал это раньше. данной ошибкой является AttributeError: «InMemoryUploadedFile» объект не имеет атрибута "временный_файл_путь"
 Nazneen16 мая 2012 г., 13:26
это приводит к ошибке ввода-вывода. Ошибка - IOError: [Errno 2] Нет такого файла или каталога: u 'a Magazine.csv & apos; Спасибо за ваше предложение

Ваш ответ на вопрос