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

Sus*_*ire 9 html python forms xlrd request

XLRD已安装并经过测试:

>>> import xlrd
>>> workbook = xlrd.open_workbook('Sample.xls')
Run Code Online (Sandbox Code Playgroud)

当我通过下面的html表单读取文件时,我可以访问所有值.

  xls_file = request.params['xls_file']
  print xls_file.filename, xls_file.type
Run Code Online (Sandbox Code Playgroud)

我正在使用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,我无法清楚地提出这个问题.)

Ruf*_*ock 48

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

xlrd.open_workbook(file_contents=fileobj.read())
Run Code Online (Sandbox Code Playgroud)

文档:

file_contents - 字符串或mmap.mmap对象或其他类似行为的对象.如果file_contents提供,filename将不会使用,除了(可能)在消息中.


Geo*_*rge -2

你可以尝试像...

import xlrd

def newopen(fileobject, modes):
    return fileobject

oldopen = __builtins__.open
__builtins__.open = newopen
InputWorkBook = xlrd.open_workbook(fileobject)
__builtins__.open = oldopen
Run Code Online (Sandbox Code Playgroud)

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

  • 在 `__builtins__` 中重新定义 `open` 是一个坏主意。您至少可以将替换函数插入到 xlrd 模块中*仅*.. (2认同)