Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中从流(而不是磁盘备份文件)读取Excel文件?_Python_Html_Forms_Request_Xlrd - Fatal编程技术网

如何在Python中从流(而不是磁盘备份文件)读取Excel文件?

如何在Python中从流(而不是磁盘备份文件)读取Excel文件?,python,html,forms,request,xlrd,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模块,请求来自:fromPylons导入请求,tmpl\u上下文为

XLRD已安装并测试:

>>> import xlrd
>>> workbook = xlrd.open_workbook('Sample.xls')
当我通过下面的html表单读取文件时,我能够访问所有的值

  xls_file = request.params['xls_file']
  print xls_file.filename, xls_file.type
我正在使用Pylons模块,请求来自:
fromPylons导入请求,tmpl\u上下文为c

我的问题是:

  • xls\u文件
    read-through
    request.params
    是对象吗
  • 如何读取
    xls\u文件
    并使其与xlrd一起工作
  • 更新:


    xls\u文件
    上载到web服务器上,但xlrd库需要文件名而不是打开的文件对象,如何使上载的文件与xlrd一起工作?(多亏了Martijn Pieters,我无法清楚地阐述这个问题。)

    你可以试试类似于

    import xlrd
    
    def newopen(fileobject, modes):
        return fileobject
    
    oldopen = __builtins__.open
    __builtins__.open = newopen
    InputWorkBook = xlrd.open_workbook(fileobject)
    __builtins__.open = oldopen
    

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

    xlrd不支持直接提供数据而无需文件路径,只需使用
    文件内容
    参数:

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

    文件内容–字符串或
    mmap.mmap
    对象或其他类似对象。如果提供了
    文件内容
    ,则将不使用
    文件名
    ,除非(可能)在消息中使用


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

    我使用的是django rest框架的请求,而不是pylons请求

    如果我编写以下简单代码:

    @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_工作簿(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编写方式的影响。

    对我来说,这段代码是有效的。Python 3

    xlrd.open_workbook(file_contents=fileobj.content)
    

    我们是否应该猜测“请求”是什么,“请求”来自何处以及您使用的是哪个web框架?这来自:
    from pylons import request,tmpl_context as c
    。您的问题似乎是您正在web服务器上接收文件上载,但xlrd库希望文件名而不是打开的文件对象。我说得对吗?如果是,您可能希望将其添加到您的问题中。:-)重新定义
    中的
    打开
    是一个非常糟糕的主意。。您至少可以只在xlrd模块中插入替换功能。为什么?这似乎是一个简单的解决方案,前提是您已经测试过它对给定的应用程序没有不利影响。同意这应该是答案