#python #azure #function
#python #azure #функция
Вопрос:
Я пишу некоторый скрипт для функции Azure с помощью python, который хочет обрабатывать файл csv, который был загружен в хранилище больших двоичных объектов. Кодирование, которое я тестировал, передается локально, но в функции Azure возникла ошибка.
Результат: Исключение сбоя: ошибка индекса: список индекс вне диапазона Стек: Файл «/azure-functions-host/workers/python/3.8/LINUX/X64/azure_functions_worker/dispatcher.py «, строка 355, в _handle__invocation_request call_result = await self._loop.run_in_executor( файл «/usr/local/lib/python3.8/concurrent/futures/thread.py «, строка 57, в результате выполнения = self.fn(*self.аргументы, ** self.kwargs) Файл «/azure-functions-host/workers/python/3.8/LINUX/X64/azure_functions_worker/dispatcher.py «, строка 542, в __run_sync_func возвращает файл func(**params) «/home/site/wwwroot/csvhandler/init.py «, строка 28, в основном тексте1=список 1[0]
Не совсем уверен, почему он сказал, что индекс списка вне стека диапазона, индекс списка должен начинаться с 0..
входная строка
ab, cd, ef r n12,34,56 r nff, gg, ee r n
код
import logging
import azure.functions as func
import pandas as pd
import numpy as np
list1=[]
def main(inputblob: func.InputStream, outputblob: func.Out[str]) -> None:
logging.info('Python Queue trigger function processed %s', inputblob.name)
str1 = inputblob.read().decode('utf-8-sig')
str1 = str1.split('\r\n') #split the string in list str1 = "ab,cd,efrn12,34,56rnff,gg,eern"
str1 = str1[0:-1]
for i in range(0,len(str1)): #split the list which can be written into pandas DataFrame
str2=str1[i].split(',')
list1.append(str2)
print(str1)
text1=list1[0] #verify if the element correct
text2=list1[1]
text3=list1[2]
text4=list1[3]
df = pd.DataFrame(list1[1:], columns=list1[0]) #create the dataframe
outstr=df.to_csv(index=False) #transfer the output to string
outputblob.set(outstr) #output the string in the blob
С другой стороны, кто-нибудь может предложить, можем ли мы просмотреть отредактированный фрейм данных как csv для хранения больших двоичных объектов? Я не могу найти здесь много информации.
Ответ №1:
Похоже, вы определили свою переменную list1
вне области действия вашей основной функции, то есть это глобальная переменная. Я полагаю, что с помощью функций Azure вам необходимо явно объявлять глобальные переменные внутри вашей основной функции, чтобы редактировать их. Из-за этого ваш список может не обновляться при добавлении элементов из вашего csv-файла, что может вызвать ошибку индекса списка. Должно быть два способа исправить это (и, возможно, другие):
- Определить
list1
как локальную переменную внутри основной функции.
def main(inputblob: func.InputStream, outputblob: func.Out[str]) -> None:
logging.info('Python Queue trigger function processed %s', inputblob.name)
list1 = []
str1 = inputblob.read().decode('utf-8-sig')
- Объявите
list1
как глобальную переменную, чтобы ее можно было использовать внутри вашей основной функции. (См. Документы по функциям Azure здесь).
list1 = []
def main(inputblob: func.InputStream, outputblob: func.Out[str]) -> None:
logging.info('Python Queue trigger function processed %s', inputblob.name)
global list1
str1 = inputblob.read().decode('utf-8-sig')
Комментарии:
1. Привет, Уилл, спасибо за ваш вклад. Я изменил свой код, но все равно получил ошибку.