如何使用 python csv writer 写入 azure output blob?

How to write to azure output blob with python csv writer?

我正在尝试使用 azure 函数从 blob 存储中读取 excel 文件,并输出一个 csv 文件。我已经使用 openpyxl 成功读取 excel 文件并对其进行了处理,但是我在写入输出 blob 时遇到了问题。我对 python 流不是很熟悉。在我原来的代码中,我打开了一个本地文件,但现在我试图打开一个流并写入它,然后将该流保存到输出 blob。 我的 function.json 看起来像

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "myblob",
      "type": "blobTrigger",
      "direction": "in",
      "path": "example/{name}.xlsx",
      "connection": "AzureWebJobsStorage"
    },
    {
      "name": "outputblob",
      "type": "blob",
      "path": "example/processed-csv.csv",
      "connection": "AzureWebJobsStorage",
      "direction": "out"
    }
  ]
}

我的代码看起来像

logging.info(f"Python blob trigger function processed blob \n"
                 f"Name: {myblob.name}\n"
                 f"Blob Size: {myblob.length} bytes")
    print('loading workbook')
    filename = myblob.name
    wb = openpyxl.load_workbook(filename = BytesIO(myblob.read()))
    logging.info(f"Loaded workbook \n")
### Excel processing here
    logging.info(f"writing csv \n")
        with StringIO() as f:
            c = csv.writer(f)
            for r in coreWorksheet.rows:
                c.writerow([cell.value for cell in r])
            outputblob.set(f)

我收到 ValueError 的错误消息:I/O 使用此代码对关闭的文件进行操作,尽管我尝试以几种不同的方式写入输出 blob。

您需要使用outputblob.set(f.getvalue())

请参考以下代码:

import logging
import openpyxl
import azure.functions as func
import io
import csv


def main(myblob: func.InputStream, outputblob: func.Out[func.InputStream]):
    logging.info(f"Python blob trigger function processed blob \n"
                 f"Name: {myblob.name}\n"
                 f"Blob Size: {myblob.length} bytes")
    logging.info('loading workbook')
    wb = openpyxl.load_workbook(filename = io.BytesIO(myblob.read()))
    coreWorksheet = wb['testSheet1']
    logging.info(coreWorksheet)
    ### Excel processing here
    logging.info(f"writing csv \n")
    with io.StringIO() as f:
        c = csv.writer(f)
        for r in coreWorksheet.rows:
            c.writerow([cell.value for cell in r])
        outputblob.set(f.getvalue())

“ValueError:I/O 对已关闭文件的操作”,当您尝试写入 blob 存储但 IO 流 returns 一个对象时会发生此错误。

您需要使用 outputblob.set(f.getvalue()) 获取值并写入 blob。

如果您尝试将 csv 文件复制到数据库中,输出绑定似乎不是最佳选择,因为 csv 文件仅在函数执行后写入,而不是在如上所述设置时写入。在这种情况下,您可以选择使用 azure-storage-blob python 包。 For more details