我有一些Azure功能应用程序,应该由Blob触发。这个想法是,每次有东西落在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,'
最后,这是供更多将使用这些文件的人使用的,因此我必须确保每次都能使用。但是,我在这里看不到任何模式。它适用于一个电子表格,而不适用于另一个电子表格。
答案 0 :(得分:1)
根据pandas.read_excel
官方文档,如下所示,由于{InputStream
类的结构,您不能使用myblob: func.InputStream
作为其参数io
。 1}}和myblob
应该是带有sas令牌或xlrd书的Blob网址。
所以我的解决方案是通过io
方法读取myblob
的内容,并通过带有read
参数的xlrd.open_workbook
方法将其转换为xlrd
书
这是我的示例代码。
file_contents
我的示例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
的内容如下。
local.settings.json
requirements.txt
function.json
{
"IsEncrypted": false,
"Values": {
"FUNCTIONS_WORKER_RUNTIME": "python",
"AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=<your account name>;AccountKey=<your account key>;EndpointSuffix=core.windows.net"
}
}
requirements.txt :只显示我的其他软件包。
{
"scriptFile": "__init__.py",
"bindings": [
{
"name": "myblob",
"type": "blobTrigger",
"direction": "in",
"path": "<your container name>/{name}",
"connection": "AzureWebJobsStorage"
}
]
}
有效。结果如下:
答案 1 :(得分:0)
可能是3个原因:
该错误消息与XLS文件的BOF(文件开始)记录有关。
Excel已经打开文件的情况。会产生相同的错误。
read_excel,当您使用read_excel读取csv文件时。
希望能有所帮助。