2016-03-03 12 views
6

Ho cercato modi per caricare file di grandi dimensioni con dati aggiuntivi, ma non sembra esserci alcuna soluzione. Per scaricare un file, sono stato utilizzando questo codice e sta lavorando bene con file di piccole dimensioni:python richiede di caricare file di grandi dimensioni con dati aggiuntivi

with open("my_file.csv", "rb") as f: 
    files = {"documents": ("my_file.csv", f, "application/octet-stream")} 
    data = {"composite": "NONE"} 
    headers = {"Prefer": "respond-async"} 
    resp = session.post("my/url", headers=headers, data=data, files=files) 

Il problema è che il codice carica l'intero file prima di inviare, e vorrei correre in MemoryError durante il caricamento di grandi dimensioni File. Ho guardato in giro, e il modo per lo streaming dei dati è quello di impostare

resp = session.post("my/url", headers=headers, data=f) 

ma ho bisogno di aggiungere { "composito": "NONE"} ai dati. In caso contrario, il server non riconoscerebbe il file.

+0

Guardando il codice in models.py, PreparedRequest class, metodo prepare_body, non c'è modo di utilizzare le richieste per lo streaming di file di grandi dimensioni con dati aggiuntivi. –

risposta

5

È possibile utilizzare il requests-toolbelt per fare questo:

import requests 
from requests_toolbelt.multipart import encoder 

session = requests.Session() 
with open('my_file.csv', 'rb') as f: 
    form = encoder.MultipartEncoder({ 
     "documents": ("my_file.csv", f, "application/octet-stream"), 
     "composite": "NONE", 
    }) 
    headers = {"Prefer": "respond-async", "Content-Type": form.content_type} 
    resp = session.post(url, headers=headers, data=form) 

Questo farà sì che le richieste di streaming l'upload multipart/form-data per voi.

+0

Grazie mille! Ricordo di aver incontrato request-toolbelt in precedenza, ma non pensavo di inserire Content-Type nell'intestazione! –

+0

Sì, la documentazione per la barra degli strumenti dice esplicitamente che ne hai bisogno. :) –

Problemi correlati