2013-07-29 13 views
6

Ich habe ein Django-Modell mit vielen Feldern (ungefähr 24), und anscheinend möchten meine Benutzer Instanzen dieses Objekts mit einem Tabellen-Upload erstellen, anstatt alle Daten manuell einzugeben in Formen.CSV mit Django und csv.DictReader analysieren

Ich habe festgestellt, dass die Verwendung von Pythons integriertem CSV-Modul dies ziemlich einfach machen sollte, aber ich habe eine harte Zeit herauszufinden, wie genau ich es verwenden soll.

Lasst uns beginnen mit dem, was ich in Bezug auf die Code haben:

def upload_file(request): 

    if request.method == "POST": 
    form = UploadFileForm(request.POST, request.FILES) 
    if form.is_valid(): 
     handle_files(request.FILES['file']) 
     return HttpResponseRedirect('/workflow/') 
    else: 
     print form.errors 
     print request.FILES 
     return HttpResponseRedirect('/workflow/upload') 
    else: 
    form = UploadFileForm() 
    return render(request, 'fileform.html', {'formset': form}) 

Dies nimmt eine CSV-Datei als Upload, und es Hände handle_files off mit dem Parsing und die Objekterstellung zu beschäftigen. Dies ist die Methode, mit der ich Probleme habe.

def handle_files(f): 
    reader = csv.DictReader(f, delimiter=' ', quotechar='|') 
    ... #? 

Ich habe versucht, den Python-docs (http://docs.python.org/2/library/csv.html) zu imitieren, aber DictReader ist sehr schlecht dokumentiert. Liefern wir csv.DictReader() die passenden Argumente? Wenn ich habe, wie bekomme ich die Informationen aus reader? Ich werde den Benutzern eine Vorlage zur Verfügung stellen, sodass ich davon ausgehen kann, dass jede Spalte der CSV-Datei über vorhersehbare Daten verfügt. Das heißt, ich weiß, dass in Spalte A Daten zu Feld X und Spalte B zu Y usw. gehören. Wie gehe ich vor, um die Daten vom Reader zu analysieren und dann ein Objekt mit diesen Daten zu erstellen?

Ich vermute, es so etwas wie sein: off

for row in reader: 
    X=row[1] 
    Y=row[2] 
    #etc 
    my_object = MyObject(x=X, y=Y) 
    my_object.save() 

Ist auf diese Weise? Sollte ich einen anderen CSV-Reader verwenden?

Vielen Dank für jede Hilfe, ich weiß, es gibt eine Menge Fragen in diesem Beitrag.

Antwort

2

Ich habe gerade angefangen, Django zu verwenden, aber ich habe die Python-CSV-Bibliothek zuvor verwendet. Wenn ich es benutze, mache ich einfach folgendes:

import csv 
... 
reader = csv.reader(f) 
for row in reader: 
    #do something with each row 
f.close() 

Sie waren also ziemlich nah dran. Die Indizierung beginnt ebenfalls bei 0, wenn Sie also das erste Element verwenden möchten, verwenden Sie row[0].

Es gibt weitere Informationen zur CSV-Bibliothek here. Sie möchten nur Trennzeichen und andere Parameter verwenden, wenn das Format Ihrer Datei unterschiedlich ist.

+0

Was ist der Sinn von DictReader dann? –

+0

Die [docs] (http://docs.python.org/2/library/csv.html#csv.DictReader) sagen, dass es "ein Objekt erstellen wird, das wie ein normaler Leser funktioniert, aber die gelesenen Informationen in ein Diktat mappt deren Schlüssel durch den optionalen Parameter fieldnames angegeben werden. Wenn der Parameter fieldnames weggelassen wird, werden die Werte in der ersten Zeile der csvfile als Feldnamen verwendet. " Was klingt wie du wäre in der Lage, Zeile ["Spalte A"] (oder eine andere Taste abhängig von der Spalte Name) –

3

Während die CSV-Datei zu erstellen, fügen Sie den Header:

people.csv

id age height 
1 20 62 
2 22 74 
3 24 68 

def handle_files(f): 
    reader = csv.DictReader(open(f)) 
    for row in reader: 
     id=row['id'] 
     age=row['age'] 
     height=row['height'] 
     my_object = MyObject(id=id, age=age,height=height) 
     my_object.save() 
+0

@DavidCain, @srinu j: Dies führt zu "Liste Indizes müssen ganze Zahlen sein, nicht str" für mich . Bevor ich den Wert wie 'id = row [0]' 'age = [1]', etc ... bekommen würde, versuche ich nun, die Header "intelligent" zu erkennen, da id nicht immer die erste Spalte ist. Muss ich hier etwas anderes machen? – teewuane

Verwandte Themen