安装并测试了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
我的问题:
xls_file
是否通过requst.params
读取了一个对象? xls_file
并使其与xlrd一起使用?更新
xls_file
已上传到Web服务器上,但xlrd库需要文件名而不是打开的文件对象,如何使上传的文件与xlrd一起使用? (感谢Martijn Pieters,我无法清楚地提出这个问题。)
答案 0 :(得分:43)
xlrd确实支持在没有文件路径的情况下直接提供数据,只需使用file_contents
参数:
xlrd.open_workbook(file_contents=fileobj.read())
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中。