Чтение do c, docx файлов из s3 внутри лямбды - PullRequest
1 голос
/ 04 мая 2020

TLDR; чтение с помощью моих AWS лямбда doc, docx файлов, которые хранятся на S3.

На моей локальной машине я просто использую textract.process(file_path) для чтения файлов do c и docx.

Таким образом, интуитивно понятный способ сделать то же самое на лямбде - это загрузить файл из s3 в локальное хранилище (tmp) на лямбде, а затем обработать файлы tmp, как я делаю на своем локальном компьютере. .

Это не рентабельно ...

Есть ли способ сделать конвейер из объекта S3 прямо в некоторый синтаксический анализатор, такой как textract, который просто преобразует doc / docx файлы в читаемый объект, такой как string?

Мой код для чтения файлов, таких как txt.

import boto3

print('Loading function')


def lambda_handler(event, context):
    try:  # Read s3 file
        bucket_name = "appsresults"
        download_path = 'Folder1/file1.txt'
        filename = download_path
        s3 = boto3.resource('s3')
        content_object = s3.Object(bucket_name, filename)        

        file_content = content_object.get()['Body'].read().decode('utf-8')

        print(file_content)

    except Exception as e:
        print("Couldnt read the file from s3 because:\n {0}".format(e))

    return event  # return event

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Этот ответ решает половину проблемы

textract.process в настоящее время не поддерживает чтение файловоподобных объектов . Если бы это произошло, вы могли бы напрямую загрузить файл из S3 в память и передать его в функцию process.

Более старая версия textract внутреннего использования пакета python-docx для чтение .docx файлов. python-docx поддерживает чтение файловых объектов. Вы можете использовать приведенный ниже код для достижения своей цели, по крайней мере для .docx файлов.

import boto3
import io
from docx import Document

s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket')
object = bucket.Object('/files/resume.docx')

file_stream = io.BytesIO()
object.download_fileobj(file_stream)

document = docx.Document(file_stream)
0 голосов
/ 04 мая 2020

AWS s3 - это хранилище объектов, которое предоставляет нам доступ к сохраненным объектам, предоставляя их через API. Поэтому для того, чтобы выполнить какую-либо обработку этих объектов, вы должны получать их только с помощью запросов GET / POST. То, что вы делаете, хорошо и экономически эффективно. Поскольку вам нужно передать весь объект в textract одновременно, вам необходимо загрузить файл.

Но если вы хотите добиться обработки больших файлов, вы можете посмотреть этот пост здесь .

...