Azure / Azure/azure-functions-python-worker

InputStream object cannot be used with pandas

Open
#832 4 comments 1 reaction 1 assignee Claimed by @vrdmr View on GitHub
area:python-functions new feature
Dominant language
Python
Stars
357
Forks
116
Avg merge
32m
Merged PRs (30d)
1

Description

In this example:

```python
import logging
import os
from azure.cosmosdb.table.tableservice import TableService
import azure.functions as func
import pandas

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")
df = pandas.read_excel(myblob, index_col=0)

table_service = TableService(account_name=os.getenv('TABLE_STORAGE_ACCOUNT_NAME'),
account_key=os.getenv('TABLE_STORAGE_KEY'))

records = df.to_dict(orient="records") 
for record in records:
table_service.insert_entity('ais', record)
```

Configured with function.json as:

```json
{
"scriptFile": "__init__.py",
"bindings": [
{
"name": "myblob",
"type": "blobTrigger",
"direction": "in",
"path": "ais/{name}.xlsx",
"connection": "anthonyshawstorage_STORAGE"
}
]
}
```

The script fails because `InputStream` does not implement the seek function. It _does_ implement `seakable()` as returning false, which is correct, but pandas doesn't adhere to that API so you get this error:

```default
Exception while executing function: Functions.BlobTrigger Result: Failure
Exception: UnsupportedOperation: seek
Stack: File "/azure-functions-host/workers/python/3.9/LINUX/X64/azure_functions_worker/dispatcher.py", line 355, in _handle__invocation_request
call_result = await self._loop.run_in_executor(
File "/usr/local/lib/python3.9/concurrent/futures/thread.py", line 52, in run
result = self.fn(*self.args, **self.kwargs)
File "/azure-functions-host/workers/python/3.9/LINUX/X64/azure_functions_worker/dispatcher.py", line 542, in __run_sync_func
return func(**params)
File "/home/site/wwwroot/BlobTrigger/__init__.py", line 13, in main
df = pandas.read_excel(myblob, index_col=0)
File "/home/site/wwwroot/.python_packages/lib/site-packages/pandas/util/_decorators.py", line 299, in wrapper
return func(*args, **kwargs)
File "/home/site/wwwroot/.python_packages/lib/site-packages/pandas/io/excel/_base.py", line 336, in read_excel
io = ExcelFile(io, storage_options=storage_options, engine=engine)
File "/home/site/wwwroot/.python_packages/lib/site-packages/pandas/io/excel/_base.py", line 1057, in __init__
ext = inspect_excel_format(
File "/home/site/wwwroot/.python_packages/lib/site-packages/pandas/io/excel/_base.py", line 942, in inspect_excel_format
stream.seek(0)
```

Technically, this is a bug in pandas, because it should check `seekable()` first.

Is there a way to make the inputstream seekable if it comes from blob storage?

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.