2012-10-14 1 views
6

私はユーザーがウェブサイトにファイルをアップロードしているので、スプレッドシートを解析する必要があります。ここに私のコードは次のとおりです。私は入れませんオープニングスプレッドシートが返されるInMemoryUploadedFile

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

エラーは次のとおりです。

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

は、なぜこれが起こっていると私はそれを修正するために何をすべきかが必要ですか?ありがとうございました。参考のため

、これはあなたがxlrdを開く前に、一時ファイルにInMemoryUploadedFileをダンプすることができ、私はシェルでファイルを開く方法

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

、あなたはスプレッドシート(​​例えばのホールドを取得することができます、あなたが持っている立場にありますユーザーはそれをあなたにメールしますか?)。ファイルをどこかにローカルに取得し、ファイルが破損していないことを確認することは可能です。 – Dave

+0

@Dave - いいえ、残念ながら私はそれを行うことはできません。更新された質問をご覧ください。 – David542

答えて

12

です。

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 

あなたがしようと、メモリ内のすべてのものを維持したい場合は:好奇心のうち

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

ディスク書き込みは不要です。それを避ける方法はありませんか? –

+0

@PetrPeller:ファイルの内容がメモリにある場合、 'open_workbook'を呼び出すときに' file_contents'パラメータを使うことができます。これは文字列(または 'mmap.mmap'オブジェクトやその他の振る舞いに似たオブジェクト)です。 file_contentsが指定されている場合、ファイル内で(おそらく)を除き、filenameは使用されません。 –

+0

正常に動作するためには、 "wb = xlrd.open_workbook(** filename = None **、file_contents = input_file.read())"のように使用しなければならなかった。 – kmonsoor

関連する問題