Функция запуска BLOB-объекта не может прочитать некоторые файлы Excel - PullRequest
0 голосов
/ 09 июня 2019

У меня есть приложение-функция Azure, которое должно запускаться с помощью BLOB-объекта. Идея состоит в том, что каждый раз, когда что-то попадает в блоб (это должны быть только файлы Excel), функция запускается и выполняет некоторую обработку.

def main(myblob: func.InputStream):
    logging.info(f"Python blob trigger function processed blob \n"
                 f"Name: {myblob.name}\n"
                 f"Blob Size: {myblob.length} bytes"
                 f"Returns:{myblob.read}")

    #read new data and replace nan with none values
    data = pd.read_excel(myblob)
    data = data.where(pd.notnull(data), None)

#processing

Этот код работал у меня во время тестирования. Однако я только что получил отредактированный файл от кого-то другого и получил Exception: XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b'\xef\xbb\xbfName,'

В конце концов, это должно быть использовано большим количеством людей, которые будут загружать эти файлы, поэтому я должен убедиться, что он работает каждый раз. Однако я не вижу здесь никакой картины. Он работает для одной таблицы и не работает для другой.

Ответы [ 2 ]

1 голос
/ 11 июня 2019

В соответствии с официальным документом pandas.read_excel, как показано ниже, вы не можете использовать myblob: func.InputStream в качестве параметра io из-за структуры InputStream класс myblob и io должен быть URL-адресом BLOB-объекта с токеном sas или книгой xlrd.

enter image description here

enter image description here

Таким образом, мое решение - прочитать содержимое myblob его методом read и преобразовать его в xlrd Book с помощью xlrd.open_workbook метода с параметром file_contents.

Вот мой пример кода.

import logging

import azure.functions as func

import pandas as pd
import xlrd

def main(myblob: func.InputStream):
    logging.info(f"Python blob trigger function processed blob \n"
                 f"Name: {myblob.name}\n"
                 f"Blob Size: {myblob.length} bytes")
    book = xlrd.open_workbook(file_contents=myblob.read())
    df = pd.read_excel(book)
    logging.info(f"{df}")

Мой образец xlsx файл, как показано ниже.

enter image description here

И мое local.settings.json, function.json & requirements.txt содержимое, как показано ниже.

local.settings.json

{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=<your account name>;AccountKey=<your account key>;EndpointSuffix=core.windows.net"
  }
}

function.json

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "myblob",
      "type": "blobTrigger",
      "direction": "in",
      "path": "<your container name>/{name}",
      "connection": "AzureWebJobsStorage"
    }
  ]
}

needs.txt : просто показать мои дополнительные пакеты.

pandas==0.24.2
xlrd >= 1.0.0

Это работает. Результаты как:

enter image description here

0 голосов
/ 10 июня 2019

Может быть 3 причины:

  • Как говорится в сообщении об ошибке, это определенно не формат Excel .xls.Откройте его в текстовом редакторе (например, «Блокнот»), который не будет обращать внимания на (неправильное) расширение .xls, и убедитесь сами.

Сообщение об ошибке относится к BOF (начало файла)) запись файла XLS.

  • Случай, когда файл уже открыт в Excel.Он генерирует ту же ошибку.

  • read_excel, когда вы использовали read_excel для чтения файла CSV.

Надеюсь, что ti помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...