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_file并使其与 xlrd 一起使用?

更新:

xls_file上传到 Web 服务器上,但 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

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

我正在使用 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_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 的影响。

于 2020-02-12T16:14:41.860 回答
0

对我来说,这段代码有效。蟒蛇 3

xlrd.open_workbook(file_contents=fileobj.content)
于 2020-11-16T16:04:49.513 回答
-3

你可以尝试类似...

import xlrd

def newopen(fileobject, modes):
    return fileobject

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

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

于 2012-08-14T16:04:08.030 回答