16

XLRD がインストールされ、テストされています。

>>> import xlrd
>>> workbook = xlrd.open_workbook('Sample.xls')

以下のように html 形式でファイルを読み取ると、すべての値にアクセスできます。

  xls_file = request.params['xls_file']
  print xls_file.filename, xls_file.type

私は Pylons モジュールを使用しています。リクエストは次のものから来ています:from pylons import request, tmpl_context as c

私の質問:

  1. オブジェクトxls_fileを介して読み取られますか?requst.params
  2. どうすればxls_filexlrdを読んで動作させることができますか?

アップデート:

xls_fileWeb サーバーにアップロードされますが、xlrd ライブラリは開いているファイル オブジェクトではなくファイル名を想定しています。アップロードされたファイルを xlrd で動作させるにはどうすればよいですか? (Martijn Pieters のおかげで、私は質問を明確に定式化することができませんでした。)

4

4 に答える 4

57

xlrd は、ファイルパスなしで直接データを提供することをサポートしていfile_contentsます。引数を使用するだけです。

xlrd.open_workbook(file_contents=fileobj.read())

ドキュメントから:

file_contents – 文字列、mmap.mmapオブジェクト、またはその他の動作に似たオブジェクト。file_contentsが指定された場合filename、(おそらく) メッセージ以外では使用されません。

于 2013-01-19T20:15:08.250 に答える
2

私が会ったことは質問と完全に同じではありませんが、おそらく似ていると思います。いくつかのヒントを与えることができます。

pylons リクエストの代わりに django rest フレームワークのリクエストを使用しています。

次のような簡単なコードを書くと:

@api_view(['POST'])
@renderer_classes([JSONRenderer])
def upload_files(request):
    file_obj = request.FILES['file']
    from xlrd import open_workbook
    wb = open_workbook(file_contents=file_obj.read())
    result = {"code": "0", "message": "success", "data": {}}
    return Response(status=200, data=result)

ここで、以前のコメントで述べたように、open_workbook(file_contents=file_obj.read()) を使用して読み取ることができます。

ただし、次の方法でコードを記述した場合:

from rest_framework.views import APIView
from rest_framework.parsers import MultiPartParser
class FileUploadView(APIView):
    parser_classes = (MultiPartParser,)

    def put(self, request, filename, format=None):
        file_obj = request.FILES.get('file')
        from xlrd import open_workbook
        wb = open_workbook(file_contents=file_obj.read())
        # do some stuff with uploaded file
        return Response(status=204)

FileUploadParser の代わりに MultiPartParser を使用すると、FileUploadParser を使用すると BOF エラーが発生することに注意する必要があります。

だから、どういうわけか、API の書き方にも影響を受けるのではないかと思っています。

于 2020-02-12T16:14:41.860 に答える
-3

あなたは次のようなことを試すことができます...

import xlrd

def newopen(fileobject, modes):
    return fileobject

oldopen = __builtins__.open
__builtins__.open = newopen
InputWorkBook = xlrd.open_workbook(fileobject)
__builtins__.open = oldopen

fileobjectがまだファイルハンドルでない場合は、StringIOでラップする必要がある場合があります。

于 2012-08-14T16:04:08.030 に答える