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
有效。结果如下:
我有一些应该由 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
有效。结果如下: