2012-10-14 11 views
6

Ho un utente che carica un file in un sito Web e devo analizzare il foglio di calcolo. Ecco il mio codice:L'apertura del foglio di calcolo restituisce InMemoryUploadedFile

input_file = request.FILES.get('file-upload') 
wb = xlrd.open_workbook(input_file) 

L'errore continuo a ricevere è:

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

Perché succede questo e che cosa devo fare per risolvere il problema? Grazie.

Per avere un riferimento, questo è il modo ho aperto il file nella shell

>>> import xlrd 
>>> xlrd.open_workbook('/Users/me/dave_example.xls') 
<xlrd.Book object at 0x10d9f7390> 
+0

Per curiosità, si è in grado di ottenere una sospensione del foglio di calcolo (ad esempio, sei in grado di avere la l'utente ti invia un'email?). Ottenere il file da qualche parte locale e verificarlo non è corrotto sarebbe utile - se possibile. – Dave

+0

@Dave - No, sfortunatamente non posso farlo. Si prega di consultare la domanda aggiornata. – David542

risposta

12

È possibile scaricare l'InMemoryUploadedFile ad un file temporaneo prima di aprire con XLRD.

try: 
    fd, tmp = tempfile.mkstemp() 
    with os.fdopen(fd, 'w') as out: 
     out.write(input_file.read()) 
    wb = xlrd.open_workbook(tmp) 
    ... # do what you have to do 
finally: 
    os.unlink(tmp) # delete the temp file no matter what 

Se si vuole tenere tutto in memoria, provare:

wb = xlrd.open_workbook(filename=None, file_contents=input_file.read()) 
+0

La scrittura del disco non sembra necessaria. Non c'è un modo per evitarlo? –

+0

@PetrPeller: se il contenuto del file è in memoria, è possibile utilizzare il parametro 'file_contents' quando si chiama' open_workbook'; è una stringa (o un oggetto 'mmap.mmap' o un altro oggetto simile allo stesso). Se viene fornito file_contents, il nome file non verrà utilizzato, tranne (eventualmente) nei messaggi. –

+0

ho dovuto usare come "wb = xlrd.open_workbook (** filename = None **, file_contents = input_file.read())" per funzionare correttamente – kmonsoor

Problemi correlati