Azure Functions - Python(Blob 触发器和绑定)

Posted

技术标签:

【中文标题】Azure Functions - Python(Blob 触发器和绑定)【英文标题】:Azure Functions - Python (Blob Trigger and Binding) 【发布时间】:2021-12-31 01:56:52 【问题描述】:

我已查看 Microsoft 提供的有关触发器的文档。 [https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-blob-trigger?tabs=python][1]

确实,在 Azure 函数中使用 func.InputStream 参数允许我们检索 blob 和一些属性 (name, uri, length),我们还可以使用 read() 函数读取字节,但是我们如何将字节转换为我们可以操作的对象,例如 Pandas 数据框(或其他类型文件的任何其他类型的对象,例如 jpg)?

我的 host.json 文件可以在下面找到:


  "scriptFile": "__init__.py",
  "bindings": [
    
      "name": "myblob",
      "type": "blobTrigger",
      "direction": "in",
      "path": "statscan/raw/ncdb/name",
      "connection": ""
    ,
    
      "type": "blob",
      "direction": "out",
      "name": "outputBlob",
      "path": "statscan/enriched/func/name.csv",
      "connection": ""
    
  ]

Blob Trigger 函数可以在下面找到:

import pandas as pd
import logging
import azure.functions as func

def main(myblob: func.InputStream, outputBlob: func.Out[str]):

    logging.info(f"Blob trigger executed!")
    logging.info(f"Blob Name: myblob.name (myblob.length) bytes")
    logging.info(f"Full Blob URI: myblob.uri")

    ### Manipulate with Pandas ###

    ### Output ###
    output = ''
    outputBlob.set(output)

【问题讨论】:

【参考方案1】:

我们有多种方法来检查文件内容并相应地读取它,在您的情况下,让我们将 csv 格式视为 blob。

为了实现这一点,我们可以下载 blob,然后将数据读取到数据帧,以下是我从 MS Docs 尝试的方法(https://docs.microsoft.com/en-us/azure/architecture/data-science-process/explore-data-blob):

  from azure.storage.blob import BlobServiceClient
  import pandas as pd

  STORAGEACCOUNTURL= <storage_account_url>
  STORAGEACCOUNTKEY= <storage_account_key>
  LOCALFILENAME= <local_file_name>
  CONTAINERNAME= <container_name>
  BLOBNAME= <blob_name>

  #download from blob
  t1=time.time()
  blob_service_client_instance = BlobServiceClient(account_url=STORAGEACCOUNTURL, credential=STORAGEACCOUNTKEY)
  blob_client_instance = blob_service_client_instance.get_blob_client(CONTAINERNAME, BLOBNAME, snapshot=None)
  with open(LOCALFILENAME, "wb") as my_blob:
      blob_data = blob_client_instance.download_blob()
      blob_data.readinto(my_blob)
  t2=time.time()
  print(("It takes %s seconds to download "+BLOBNAME) % (t2 - t1))

其他我们可以直接用blob sas url转换如下:

  from io import StringIO
  blobstring = blob_service.get_blob_to_text(CONTAINERNAME,BLOBNAME).content
  df = pd.read_csv(StringIO(blobstring))

另一种方式是使用blob sas url,我们可以在blob上右键选择“Generate SAS”来获取:

    import pandas as pd
    data = pd.read_csv('blob_sas_url')


【讨论】:

以上是关于Azure Functions - Python(Blob 触发器和绑定)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python Azure Functions QueueTrigger 手动使消息出队?

Azure Functions HTTP 触发器:如何将异常从 python 工作日志返回给 API 调用者

如何配置我的 Azure Functions 环境,以便可以在 Python 代码中使用 Cosmos DB 客户端?

无法在 azure 函数应用程序中创建 python 函数

如何从 Azure Functions 中的存储容器读取多个文件

Azure Functions - 使用 Azure Functions 的表存储触发器