Hochladen und Parsen der CSV-Datei mit der Google App-Engine

7

Ich frage mich, ob jemand mit einem besseren Verständnis von Python und Gae mir dabei helfen kann. Ich lade eine CSV-Datei von einem Formular in den gae-Datenspeicher hoch.

%Vor%

Ich stoße auf dasselbe Problem, das jemand anders hier erwähnt - Ссылка

Das heißt, der csv.reader wiederholt jedes Zeichen und nicht die Zeile. Ein Google-Techniker hat diese Erklärung verlassen:

  

Der Aufruf self.request.get ('csv') gibt einen String zurück. Wenn Sie über eine iterieren   Zeichenfolge, iterieren Sie über die Zeichen, nicht die Zeilen. Du kannst das ... sehen   Unterschied hier:

%Vor%

Ich folge der Erklärung wirklich nicht und konnte sie nicht umsetzen. Kann jemand eine klarere Erklärung dafür und eine vorgeschlagene Lösung bieten?

Danke, August

    
August Flanagan 03.06.2010, 23:48
quelle

3 Antworten

13

Kurze Antwort, versuchen Sie es:

%Vor%

Lange Antwort, beachten Sie Folgendes:

%Vor%

Wenn stuff ein Dateizeiger ist, ist jede Sache eine Zeile. Wenn Zeug eine Liste ist, ist jedes Ding ein Gegenstand. Wenn Zeug eine Zeichenfolge ist, ist jedes Ding ein Zeichen.

Das Iterieren über das Objekt, das von csv.reader zurückgegeben wird, wird Ihnen ein Verhalten geben, das dem Iterieren über das übergebene Objekt nur bei jedem CSV-analysierten Objekt ähnelt. Wenn Sie über eine Zeichenfolge iterieren, erhalten Sie eine CSV-analysierte Version jedes Zeichens.

    
Drew Sears 04.06.2010, 00:44
quelle
8

Ich kann mir keine klarere Erklärung einfallen lassen als das, was der erwähnte Google-Ingenieur gesagt hat. Also lasst uns das ein bisschen unterbrechen.

Das Modul Python csv arbeitet mit dateiähnlichen Objekten, das ist eine Datei oder etwas, das sich wie eine Python-Datei verhält. Daher erwartet csv.reader () ein Dateiobjekt als einzigen Parameter zu erhalten.

Das Objekt webapp.RequestHandler request bietet Zugriff auf die HTTP-Parameter, die im Formular gepostet werden. In HTTP werden Parameter als Schlüssel / Wert-Paare angegeben, z. B. csv=record_one,record_two . Wenn Sie self.request.get('csv') aufrufen, wird der Wert zurückgegeben, der mit dem Schlüssel csv als Python-Zeichenfolge verknüpft ist. Eine Python-Zeichenfolge ist kein dateiähnliches Objekt. Offensichtlich fällt das csv Modul zurück, wenn es das Objekt nicht versteht und es einfach iteriert (in Python können Strings iteriert werden nach Zeichen, zB for c in 'Test String': print c druckt jedes Zeichen in der Zeichenfolge in einer separaten Zeile ).

Glücklicherweise bietet Python eine StringIO -Klasse, die es ermöglicht, einen String als dateiähnliches Objekt zu behandeln. Also (vorausgesetzt GAE unterstützt StringIO, und es gibt keinen Grund, warum es nicht sollte) sollten Sie in der Lage sein, dies zu tun:

%Vor%

Was so funktioniert, wie Sie es erwarten.

Bearbeiten Ich gehe davon aus, dass Sie so etwas wie <textarea/> verwenden, um die CSV-Datei zu sammeln. Wenn Sie einen Anhang hochladen, ist möglicherweise eine andere Handhabung erforderlich (ich kenne mich mit Python GAE nicht so gut aus oder weiß, wie Anhänge gehandhabt werden).

    
ig0774 04.06.2010 00:41
quelle
0

Sie müssen csv_file = self.request.POST.get("csv_import") und nicht csv_file = self.request.get("csv_import") .

aufrufen

Der zweite gibt Ihnen nur eine Zeichenfolge, wie Sie in Ihrem ursprünglichen Beitrag erwähnt haben. Wenn Sie jedoch über self.request.POST.get zugreifen, erhalten Sie ein Objekt cgi.FieldStorage .

Dies bedeutet, dass Sie csv_file.filename aufrufen können, um den Dateinamen des Objekts zu erhalten, und csv_file.type , um den MIME-Typ zu erhalten. Wenn Sie auf csv_file.file zugreifen, handelt es sich außerdem um ein StringO-Objekt (ein schreibgeschütztes Objekt aus dem StringIO-Modul ), nicht nur eine Zeichenfolge. Da ig0774 in seiner Antwort erwähnt wird, können Sie mit dem StringIO-Modul eine Zeichenfolge als Datei behandeln.

Daher kann Ihr Code einfach lauten:

%Vor%     
Sam 01.08.2016 09:48
quelle

Tags und Links