如何在Python中从流(而不是磁盘备份文件)读取Excel文件?
XLRD已安装并测试:如何在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上下文为
>>> 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-throughrequest.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模块中插入替换功能。为什么?这似乎是一个简单的解决方案,前提是您已经测试过它对给定的应用程序没有不利影响。同意这应该是答案