#python #azure #azure-functions
Вопрос:
У меня проблемы с чтением содержимого / данных с помощью Python и BlobTrigger. Я использую локальную среду и следовал документации (https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-blob-trigger?tabs=python). Функция прослушивается и также успешно запускается, когда я загружаю файл в локальный эмулятор больших двоичных объектов. Я также могу получить путь к файлу / имя файла в переменной, но не могу прочитать содержимое загруженного файла.
Когда я пытаюсь получить содержимое, оно всегда показывает пустую строку или массив.
Итак, это мой файл functions.json:
{
"scriptFile": "__init__.py",
"bindings": [
{
"name": "myblob",
"type": "blobTrigger",
"direction": "in",
"path": "log/SystemLog/{name}",
"connection": ""
}
]
}
Это мой init.py файл:
импорт журнала
импорт azure.functions как функции
def main(myblob: func.InputStream):
print(myblob.name)
print(myblob.length)
print(myblob.readlines())
Это то, что печатается в консоли:
[2021-10-29T07:27:25.053Z] Host lock lease acquired by instance ID '000000000000000000000000F86KCB51'.
[2021-10-29T07:27:25.124Z] Worker process started and initialized.
[2021-10-29T07:27:46.941Z] Executing 'Functions.BlobTriggerLocalTest' (Reason='New blob detected: log/SystemLog/testfile.txt', Id=3981bd58-accb-4c9c-b3e4-fe33b1a74522)
[2021-10-29T07:27:46.948Z] Trigger Details: MessageId: 7c575bad-88b7-46d4-b5bf-67b90fe0ab4d, DequeueCount: 1, InsertionTime: 2021-10-29T07:27:46.000 00:00, BlobCreated: 2021-10-29T07:27:43.000 00:00, BlobLastModified: 2021-10-29T07:27:43.000 00:00
[2021-10-29T07:27:47.032Z] log/SystemLog/testfile.txt
[2021-10-29T07:27:47.037Z] None
[2021-10-29T07:27:47.042Z] []
[2021-10-29T07:27:47.068Z] Executed 'Functions.BlobTriggerLocalTest' (Succeeded, Id=3981bd58-accb-4c9c-b3e4-fe33b1a74522, Duration=204ms)
Я попробовал несколько решений, чтобы справиться с проблемой.
Первым делом нужно было ознакомиться с документацией https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-blob-input?tabs=python. Но изменения в файлах functions.json не совсем понятны для меня. Я попытался ввести
{
"name": "inputblob",
"type": "blob",
"dataType": "binary",
"path": "log/SystemLog/{name}",
"connection": "",
"direction": "in"
},
в файле functions.json и добавил inputblob в качестве второго параметра к основному методу, но len(inputblob) также выводит 0.
Я думаю, что я также мог бы использовать и импортировать BlobServiceClient из azure.storage.blob. Но я предполагаю, что BlobServiceClient потребуется отдельная строка подключения, и я хочу избежать этого.
Ответ №1:
Решение простое: не используйте Visual Studio Code в качестве проводника файлов для загрузки с помощью перетаскивания.
Документация к локальной среде привела меня к использованию VS Code в качестве проводника файлов для локального большого двоичного объекта. Загрузка файла с рабочего стола в большой двоичный объект приводит к потере содержимого файла. Файл загружается с правильным именем файла, но внутри он пуст. Использование MS Storage Explorer решает проблему.
Ответ №2:
Мы можем прочитать содержимое из кода python, используя download_blob()
функцию с добавлением content_as_text
к ней.
Ниже приведен пример кода:
import logging
import sys
import os
import azure.functions as func
from azure.storage import blob
from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient, __version__
def main(myblob: func.InputStream):
try:
logging.info(f"Python blob trigger function processed blob n")
CONN_STR = "ADD_CON_STR"
blob_service_client = BlobServiceClient.from_connection_string(CONN_STR)
# MAP SOURCE FILE
blob_client = blob_service_client.get_blob_client(container="newcontainer0805", blob="source.txt")
#SOURCE CONTENTS
content = blob_client.download_blob().content_as_text
print(content)
Позже вы можете распечатать содержимое как печать (содержимое).
Комментарии:
1. Конечно, но я бы ожидал, что входной параметр «myblob» будет содержать большой двоичный объект. Я хочу избежать загрузки его с помощью нового соединения.