繁体   English   中英

如何使用python csv writer写入azure输出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 operation on closed file with this code,尽管我尝试以几种不同的方式写入输出 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 operation on closed file”,当您尝试写入 blob 存储但 IO 流返回一个对象时,会发生此错误。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM