如何在Python中从流(不是磁盘支持的文件)中读取Excel文件?

时间:2012-08-14 15:05:54

标签: python html forms request xlrd

安装并测试了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_file并使其与xlrd一起使用?
  3. 更新

    xls_file已上传到Web服务器上,但xlrd库需要文件名而不是打开的文件对象,如何使上传的文件与xlrd一起使用? (感谢Martijn Pieters,我无法清楚地提出这个问题。)

4 个答案:

答案 0 :(得分:43)

xlrd确实支持在没有文件路径的情况下直接提供数据,只需使用file_contents参数:

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

来自documentation

  

file_contents - 字符串或mmap.mmap对象或其他一些行为相似的对象。如果提供file_contents,则不会使用filename,除非(可能)在邮件中。

答案 1 :(得分:1)

我遇到的问题与问题并不完全相同,但我认为可能是相似的,我可以给出一些提示。

我使用的是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)

您必须注意,使用MultiPartParser而不是FileUploadParser,使用FileUploadParser会引发一些BOF错误。

所以我想知道它在某种程度上也受您编写API的影响。

答案 2 :(得分:0)

对我来说,此代码有效。 Python 3

xlrd.open_workbook(file_contents=fileobj.content)

答案 3 :(得分:-3)

您可以尝试类似......

import xlrd

def newopen(fileobject, modes):
    return fileobject

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

如果文件对象不是文件句柄,则可能必须将文件对象包装在StringIO中。