Python 使用xlrd打开字节码(xlsx)

Python 使用xlrd打开字节码(xlsx),python,xlrd,bytesio,Python,Xlrd,Bytesio,我与Django合作,需要阅读上传的xlsx文件的表格和单元格。使用xlrd应该可以,但由于文件必须保留在内存中,并且可能无法保存到某个位置,因此我不确定如何继续 本例中的起点是一个带有上载输入和提交按钮的网页。提交文件时,会捕获到request.FILES['xlsx_file'].file,并发送到处理类,该类必须提取所有重要数据以进行进一步处理 request.FILES['xlsx_file'].file的类型为BytesIO,由于没有getitem方法,xlrd无法读取该类型 将Byt

我与Django合作,需要阅读上传的xlsx文件的表格和单元格。使用xlrd应该可以,但由于文件必须保留在内存中,并且可能无法保存到某个位置,因此我不确定如何继续

本例中的起点是一个带有上载输入和提交按钮的网页。提交文件时,会捕获到
request.FILES['xlsx_file'].file
,并发送到处理类,该类必须提取所有重要数据以进行进一步处理

request.FILES['xlsx_file'].file
的类型为BytesIO,由于没有getitem方法,xlrd无法读取该类型

将BytesIO转换为StringIO后,错误消息似乎保持不变
“\u io.StringIO”对象没有属性“\u getitem\u”

    file_enc = chardet.detect(xlsx_file.read(8))['encoding']
    xlsx_file.seek(0)

    sio = io.StringIO(xlsx_file.read().decode(encoding=file_enc, errors='replace'))
    workbook = xlrd.open_workbook(file_contents=sio)

请尝试
xlrd.open\u工作簿(file\u contents=request.FILES['xlsx\u file'].read())

我正在将我的评论转换为自己的答案。它与更新问题中给出的示例代码(包括解码)有关:


好的,谢谢你的指点。我下载了xlrd并在本地进行了测试。似乎最好的方法是传递一个字符串,即
open\u工作簿(file\u contents=xlsx\u file.read().decode(encoding=file\u enc,errors='replace'))
。我误解了文档,但我肯定file_contents=将与字符串一起工作。

我也有类似的问题,但在我的情况下,我需要通过xls文件的用户下载对Djano应用程序进行单元测试

使用StringIO的基本代码对我很有用

class myTest(TestCase):
    def test_download(self):
        response = self.client('...')
        f = StringIO.StringIO(response.content)
        book = xlrd.open_workbook(file_contents = f.getvalue() )
        ...
        #unit-tests here

嗨,你能给我们一些你用来解决这个问题的代码吗?这将有助于达成解决办法。根据您当前的描述,我只能大胆猜测xlrd需要一个类似文件的对象,因此应该可以获得上传的xlsx文件,将其输入到
StringIO
对象中,并将其传递给xlrd。对于这种特殊情况,没有太多代码,但我会尝试提供更多的上下文。所以您认为StringIO就足够了吗?好的,谢谢您的指点。我下载了xlrd并在本地进行了测试。似乎最好的方法是传递一个字符串,即
open\u工作簿(file\u contents=xlsx\u file.read().decode(encoding=file\u enc,errors='replace'))
。我误解了文档,但我肯定
file\u contents=
将与字符串一起工作。为此,您必须使用xlrd的api来读取工作簿页面/单元格,以及其他任何内容,我将把它放在一个单独的问题中:)。另外,如果它解决了在不将xlsx文件写入磁盘的情况下打开xlsx文件的问题,请接受我的回答!在这种情况下,似乎不需要解码,因为它是ascii类型,所以读取就可以工作。我仍然收到以下错误:
Exception type:TypeError Exception Value:for的不支持的操作数类型