2017-06-28 4 views
2

Ich habe Django REST und mein Endpunkt akzeptieren POST mit Attachemtn.
Suche funktioniert nicht in Speicherdatei

if serializer.is_valid(): 
     instance = UploadedFile.objects.create(
      file=serializer.validated_data['file'], 
      username=self.request.user.get_username(), 
     ) 

Dann habe ich auf die Funktion Datei. Wiederholen Sie diese In-Memory-Datei wiederholt in Schleife.

for pair in daterange(start_date, end_date): 
    bkk_start_datetime = mom_datetime.datetime.combine(pair, mom_datetime.time(0, 0)) 
    bkk_end_datetime = mom_datetime.datetime.combine(pair + timedelta(days=1), mom_datetime.time(0, 0)) 

    ans_dict = { 
     "bkk_start_datetime": bkk_start_datetime, 
     "bkk_end_datetime": bkk_end_datetime, 
     "pin_values": pin_values_from_file(instance, bkk_start_datetime, bkk_end_datetime) 
    } 
    ans.append(ans_dict) 

Diese Funktion hat Problem, weil Datei an der ersten Stelle nicht suchen. Obwohl ich setze .seek(0)

def pin_values_from_file(instance: object, start_date: datetime, end_date: datetime): 
    csv_file = io.StringIO(instance.file.read().decode('utf-16')) 
    csv_file.seek(0) # Seek the first line again. Otherwise next day will be zero all 
    reader = csv.reader(csv_file, dialect='excel-tab') 
    count = 0 
    holder = AwardHolder() 
    logger.info(f"pin_values_from_file receive {start_date}, {end_date}") 

Wie es zu lassen, erneut zu lesen in-memory-Datei?

Antwort

1

Das Problem ist nicht mit der Speicherversion. Denken Sie darüber nach: Sie erstellen die Speicherdatei in der Funktion, so wird es immer bei Offset 0 sein.

Was wird nicht bei Offset 0 sein ist instance.file. Dies ist ein Beispiel von FieldFile und wie pro-Dokumentation:

FieldFile.open (mode =‘rb‘)

öffnet oder öffnet die Datei mit diesem Beispiel in dem angegebenen Modus zugeordnet ist. Im Gegensatz zur Python-Methode open() gibt es keinen Dateideskriptor zurück.

Da die zugrunde liegende Datei beim Zugriff implizit geöffnet wird, ist es möglicherweise nicht erforderlich, diese Methode aufzurufen, außer den Zeiger auf die zugrunde liegende Datei zurückzusetzen oder den Modus zu ändern.

Also, wenn Sie nicht suchen können, da es nicht implementiert ist, können Sie es wieder öffnen:

f = instance.file.open(mode='rt') 
csv_file = io.StringIO(f.read().decode('utf-16')) 
+0

Ich versuche, Ihre Nachrichten – Sarit

+0

Vielen Dank für Ihre Antwort zu verstehen. Aber ich habe den Fehler 'io.UnsupportedOperation: seek' erhalten. Ich glaube, dass es das erhöht, weil meine Datei keine Datei auf der Festplatte ist, sondern eine Datei von' request' und noch nicht im Speicher gespeichert ist. Dann habe ich beschlossen, eine neue Klasse zu erstellen und den ganzen Wert darin zu speichern, und jetzt kann ich sie wieder lesen – Sarit

+0

Ah ja, Sie sind richtig. – Melvyn