2012-05-16 13 views
7

Zajmuję się tworzeniem aplikacji w Pythonie z django. Użytkownik może przesłać plik CSV. Używam wysyłania plików, aby pobrać plik. Ale nie jest przechowywany w żadnym miejscu. Próbuję pobrać go z żądania przetworzenia pliku. Podczas próby otwarcia pliku, powoduje on błąd. Używam biblioteki CSV istniejącej w Pythonie do przetworzenia. Formuj elementy i atrybuty używane zgodnie z django. Żądany obiekt, który próbuję pobrać przesłany plik, to także obiekt zaprojektowany przez django.Błąd typu podczas otwierania przesłanego pliku 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) 

Ta linia poniżej podaje błąd.

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

Podana błędu:

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

Uprzejmie proszę podać swoje sugestie, jeśli masz jakiś pomysł na ten temat. Z góry dzięki.

Odpowiedz

5

open() przyjmuje nazwę pliku jako argument, a nie sam obiekt pliku.

można spróbować czegoś takiego:

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

ten produkuje błąd IO Błąd jest IOError: [ERRNO 2] Nie ma takiego pliku lub katalogu: u'Magazine.csv” Dzięki za sugestię – Nazneen

+0

Moje złe, ale w zasadzie chodzi o to, aby uzyskać ścieżkę przesłanych plik. Wypróbuj ten, który właśnie edytowałem. – zubinmehta

+0

Daje to błąd atrybutu. Ja też próbowałem tego wcześniej. dany błąd to AttributeError: Obiekt "InMemoryUploadedFile" nie ma atrybutu "temporary_file_path" – Nazneen

0

Otrzymujesz TypeError, ponieważ wbudowana funkcja open oczekuje ciągu będącego ścieżką do pliku.

Czy to działa?

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

Nie sądzę, że przedmiot plik ma otwartą metodę() – zubinmehta

+0

nie działa. Jest napisane "NoneType: None" .. Podziękowania dla sugestii – Nazneen

+0

Zmieniono sugestię. Klasa InMemoryUploadedFile implementuje metodę otwartą z modułu [django.core.files] (https://docs.djangoproject.com/en/dev/ref/files/file/) – Schuh

8

Nie ma potrzeby, aby zadzwonić na otwartym pliku, to jest już otwarte. Powinieneś być w stanie przekazać go bezpośrednio do DictReader.

+0

Ten też działa dobrze ... Wielkie dzięki. możemy przejść bezpośrednio. Ten sposób wydaje się naprawdę dobry. Dziękuję Ci bardzo – Nazneen

8

Działa to dla 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) 
Powiązane problemy