2012-10-14 17 views
6

Tôi có một người dùng tải tệp lên trang web và tôi cần phải phân tích cú pháp bảng tính. Đây là mã của tôi:Mở bảng tính trả về InMemoryUploadedFile

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

Các lỗi tôi tiếp tục nhận được là:

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

Tại sao điều này xảy ra và những gì tôi cần phải làm gì để khắc phục nó? Cảm ơn bạn.

Để tham khảo, đây là cách tôi mở file trong vỏ

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

Ra khỏi tò mò, bạn có thể có được một tổ chức của các tờ lây lan (ví dụ, bạn đang ở một vị trí để có người dùng gửi email cho bạn?). Lấy tệp ở đâu đó cục bộ và xác minh nó không bị hỏng sẽ hữu ích - nếu có thể. – Dave

+0

@Dave - Không, tiếc là tôi không thể làm điều đó. Vui lòng xem câu hỏi được cập nhật. – David542

Trả lời

12

Bạn có thể đổ InMemoryUploadedFile vào một tập tin tạm thời trước khi mở với 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 

Nếu bạn muốn giữ lại tất cả mọi thứ trong bộ nhớ, hãy thử:

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

Ghi đĩa có vẻ không cần thiết. Không có cách nào để tránh nó? –

+0

@PetrPeller: Nếu bạn có nội dung tập tin trong bộ nhớ, bạn có thể sử dụng tham số 'file_contents' thay vì khi gọi' open_workbook'; nó là một chuỗi (hoặc một đối tượng 'mmap.mmap' hoặc một số đối tượng hành xử giống nhau). Nếu file_contents được cung cấp, tên tập tin sẽ không được sử dụng, ngoại trừ (có thể) trong các tin nhắn. –

+0

tôi phải sử dụng như "wb = xlrd.open_workbook (** filename = None **, file_contents = input_file.read())" để hoạt động đúng cách – kmonsoor

Các vấn đề liên quan