2012-05-16 5 views
7

Я разрабатываю приложение в python с django. Пользователь может загрузить CSV-файл. Я использую загрузку файла для получения файла. Но он не хранится нигде. Я пытаюсь взять его из запроса для обработки файла. Пока я пытаюсь открыть файл, он дает ошибку. Я использую библиотеку CSV, существующую в python для обработки. Элементы и атрибуты формы, используемые для django. Объект запроса, который я пытаюсь загрузить загруженный файл, также является объектом, созданным django.Получение ошибки типа при открытии загруженного CSV-файла

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() принимает имя файла как аргумент, а не сам файл.

Вы можете попробовать что-то вроде этого:

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

это приводит к ошибке IO Ошибка IOError: [Errno 2] Нет такого файла или каталога: u'Magazine.csv» Благодарим Вас за предложение – Nazneen

+0

Мое плохое, но в принципе идея не является, чтобы получить путь загруженное файл. Попробуйте тот, который я только что редактировал. – zubinmehta

+0

Это дает ошибку атрибута. Я тоже пробовал это раньше. данная ошибка: AttributeError: объект 'InMemoryUploadedFile' не имеет атрибута 'tempor_file_path' – Nazneen

0

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

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

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

Я не думаю, что объектный файл имеет метод открытого() – zubinmehta

+0

Это не работает. Он говорит «NoneType: None». Спасибо за предложение – Nazneen

+0

Отредактировано предложение. Класс InMemoryUploadedFile реализует открытый метод из модуля [django.core.files] (https://docs.djangoproject.com/en/dev/ref/files/file/) – Schuh

8

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

+0

Этот тоже отлично работает. Большое спасибо. мы можем пройти напрямую. Этот способ кажется действительно хорошим. большое спасибо – Nazneen

8

Это работает для 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) 
Смежные вопросы