【问题标题】:Reading doc, docx files from s3 within lambda在 lambda 中从 s3 读取 doc、docx 文件
【发布时间】:2020-05-04 10:58:29
【问题描述】:

TLDR;使用我的 AWS lambda docdocx 读取存储在 S3 上的文件。

在我的本地机器上,我只使用textract.process(file_path) 来读取 doc 和 docx 文件。

因此,在 lambda 上执行相同操作的直观方法是将文件从 s3 下载到 lambda 上的本地存储 (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

【问题讨论】:

  • not cost-effective,你的意思是 lambda 成本吗?我不确定您的每月使用情况,但您可能在免费套餐中使用 lambda。
  • by not cost-effective 我的意思是,不是只读取 s3 文件(我们必须这样做),我们还将文件保存在本地存储中(这会消耗时间)然后加载它(这也消耗时间)@Ersoy
  • 我明白,这是任何语言的正常行为。 Afaik,事件在 s3 上没有可用的转换/转换器管道。

标签: python amazon-s3 aws-lambda docx doc


【解决方案1】:

这个答案解决了一半问题

textract.processcurrently doesn't support reading file-like objects。如果是这样,您可以直接将文件从 S3 加载到内存中并将其传递给 process 函数。

Older version of textract 内部使用python-docx 包来读取.docx 文件。 python-docx 支持读取 file-like 对象。您可以使用下面的代码来实现您的目标,至少对于 .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)

【讨论】:

    【解决方案2】:

    如果您正在从 s3 读取 docx 文件,则 Document() 构造函数需要文件的路径。相反,您可以读取字节格式的文件并像这样调用构造函数。

    from docx import Document
    
    def parseDocx(data):
        data = io.BytesIO(data)
        document = Document(docx = data)
        content = ''
        for para in document.paragraphs:
            data = para.text
            content+= data
        return content
    
    Key = "acb.docx"
    Bucket = "xyz"
    obj_ = s3_client.get_object(Bucket= Bucket, Key=Key)
    if Key.endswith('.docx'):
        fs = obj_['Body'].read()
        sentence = str(parseDocx(fs))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-01
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      相关资源
      最近更新 更多