2012-05-16 17 views
7

Ich entwickle eine Anwendung in Python mit Django. Benutzer kann eine CSV-Datei hochladen. Ich verwende Datei-Upload, um die Datei zu erhalten. Aber es wird nirgendwo gespeichert. Ich versuche es aus Anfrage zu nehmen, um die Datei zu verarbeiten. Während ich versuche, die Datei zu öffnen, wird ein Fehler angezeigt. Ich benutze die CSV-Bibliothek in Python zur Verarbeitung. Formelemente und Attribute, die nach Django verwendet werden. Request Objekt, das ich versuche, die hochgeladene Datei zu nehmen, ist auch Django entworfenes Objekt.Fehler beim Öffnen einer hochgeladenen CSV-Datei

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) 

Die folgende Zeile gibt den Fehler an.

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

Der angegebene Fehler ist:

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

Bitte freundlich Ihren Vorschlag geben, wenn Sie auf diese jede Idee. Vielen Dank im Voraus.

Antwort

5

open() übernimmt den Namen der Datei als Argument und nicht das Dateiobjekt selbst.

Können Sie versuchen, etwas wie folgt aus:

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

dies erzeugt einen IO-Fehler Fehler ist IOError: [Errno 2] Datei oder Verzeichnis: u'Magazine.csv‘ Vielen Dank für Ihren Vorschlag – Nazneen

+0

Meine schlecht, aber im Grunde ist die Idee, den Weg des hochgeladen zu bekommen Datei. Probiere das, das ich gerade bearbeitet habe. – zubinmehta

+0

Dies ergibt einen Attributfehler. Ich habe das auch schon mal probiert. angegebenen Fehler ist AttributeError: 'InMemoryUploadedFile' Objekt hat kein Attribut 'temporary_file_path' – Nazneen

0

Sie erhalten einen TypeError, weil die integrierte Funktion open einen String erwartet, der ein Pfad zu einer Datei ist.

Funktioniert das?

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

Ich glaube nicht, dass Dateiobjekt hat eine Methode open() – zubinmehta

+0

Es funktioniert nicht. Es heißt "NoneType: None" .. Danke für den Vorschlag – Nazneen

+0

Bearbeitete den Vorschlag. Die InMemoryUploadedFile-Klasse implementiert die open-Methode aus dem [django.core.files-Modul] (https://docs.djangoproject.com/en/dev/ref/files/file/) – Schuh

8

Keine Notwendigkeit, auf die Datei rufen offen, es ist bereits geöffnet. Sie sollten es direkt in den DictReader übertragen können.

+0

Dies funktioniert auch gut .. Vielen Dank. Wir können direkt passieren. Dieser Weg scheint wirklich gut zu sein. Vielen Dank – Nazneen

8

Dies funktioniert für 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) 
Verwandte Themen