Blob 触发函数无法读取某些 excel 个文件

Blob triggered function cannot read some excel files

我有一些应该由 blob 触发的 azure 函数应用程序。这个想法是,每当有东西落在 blob 上时(那些应该只是 excel 文件),该函数就会运行并进行一些处理。

def main(myblob: func.InputStream):
    logging.info(f"Python blob trigger function processed blob \n"
                 f"Name: {myblob.name}\n"
                 f"Blob Size: {myblob.length} bytes"
                 f"Returns:{myblob.read}")

    #read new data and replace nan with none values
    data = pd.read_excel(myblob)
    data = data.where(pd.notnull(data), None)

#processing

这段代码在测试期间对我有用。但是,我刚收到别人发来的编辑文件,得到Exception: XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b'\xef\xbb\xbfName,'

最后,这是为了让更多上传这些文件的人使用,所以我必须确保它每次都能正常工作。但是,我在这里看不到任何模式。它适用于一个电子表格,但对另一个电子表格无效。

可能有 3 个原因:

  • 正如错误消息所说,这绝对不是 Excel .xls 格式。使用不会注意到(不正确的).xls 扩展名的文本编辑器(例如记事本)打开它并亲自查看。

错误消息与 XLS 文件的 BOF(文件开头)记录有关。

  • 文件已被 Excel 打开的情况。它会产生相同的错误。

  • read_excel ,当您使用 read_excel 读取 csv 文件时。

希望对你有所帮助。

根据 pandas.read_excel offical document, as below, you can not use myblob: func.InputStream as its parameter io, because of the struct of the InputStream class of myblob and io 应该是一个 blob url with sas token or xlrd book.

所以我的解决方案是通过 read 方法读取 myblob 的内容,并通过 file_contents 方法通过 xlrd.open_workbook 方法将其转换为 xlrd Book ]参数。

这是我的示例代码。

import logging

import azure.functions as func

import pandas as pd
import xlrd

def main(myblob: func.InputStream):
    logging.info(f"Python blob trigger function processed blob \n"
                 f"Name: {myblob.name}\n"
                 f"Blob Size: {myblob.length} bytes")
    book = xlrd.open_workbook(file_contents=myblob.read())
    df = pd.read_excel(book)
    logging.info(f"{df}")

我的示例 xlsx 文件如下。

还有我的local.settings.json,function.json & requirements.txt内容如下

local.settings.json

{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=<your account name>;AccountKey=<your account key>;EndpointSuffix=core.windows.net"
  }
}

function.json

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "myblob",
      "type": "blobTrigger",
      "direction": "in",
      "path": "<your container name>/{name}",
      "connection": "AzureWebJobsStorage"
    }
  ]
}

requirements.txt: 只显示我的附加包。

pandas==0.24.2
xlrd >= 1.0.0

有效。结果如下: