【问题标题】:extract text from pdf File from S3 bucket python从S3存储桶python的pdf文件中提取文本
【发布时间】:2022-02-13 06:03:44
【问题描述】:

我的 AWS s3 存储桶中有多个格式文件,例如 pdf、doc、rtf、odt、png,我需要从中提取文本。 我已经设法通过它们的路径获取内容列表。现在根据文件类型,我将使用不同的库从文件中提取文本。由于文件可能有数千个,我需要直接从 s3 中提取文本而不是下载。

filespath=['https://abc.s3.ap-south-1.amazonaws.com/DocumentOnPATest', 'https://abc.s3.ap-south-1.amazonaws.com/IndustryReport2019.pdf', 'https://abc.s3.ap-south-1.amazonaws.com/receipt.png', 'https://abc.s3.ap-south-1.amazonaws.com/sample.rtf', 'https://abc.s3.ap-south-1.amazonaws.com/sample1.odt']

bucketname =abc

我尝试了一些东西,但它给了我错误

for path in filespath:
    ext=pathlib.Path(path).suffix
    if ext=='.pdf':
       pdf_file=PyPDF2.PdfFileReader(path)
       print(pdf_file.extractText())

但我遇到了错误

  File "F:\Projects\FileExtractor\fileextracts3.py", line 28, in <module>
    pdf_file=PyPDF2.PdfFileReader(path)

  File "C:\ProgramData\Anaconda3\lib\site-packages\PyPDF2\pdf.py", line 1081, in __init__
    fileobj = open(stream, 'rb')

OSError: [Errno 22] Invalid argument: 'https://abc.s3.ap-south-1.amazonaws.com/IndustryReport2019.pdf

请帮我带头。谢谢

【问题讨论】:

  • “由于文件可能有数千个,我需要直接从 s3 中提取文本而不是下载”——除非您下载该数据,否则您无法在本地操作数据。这并不意味着您必须将其写入文件,也不意味着您必须在完成处理后保留它。

标签: python amazon-s3 python-pdfreader


【解决方案1】:

PyPDF2 不支持直接从 s3 读取。您需要先在本地下载它们。

或者您可以尝试使用 [AWS Lambda 函数][1] 直接从 s3 存储桶处理文件。 罢工>

【讨论】:

  • 对不起,我没听懂。你能用简单的话解释一下吗?我是否需要在我的 aws lambda 中创建一个 lambda 函数如果是,那么它如何应用于多个文件。@Krishna Chaurasia
  • 实际上,根据答案中的链接,我认为即使使用 lambda 函数,您也必须在处理之前从 s3 下载文件。我将编辑答案以删除第二部分。
【解决方案2】:

您可以尝试由 Justin Leto 提供的 boto3 解决方案 here。您仍然需要一种读取/转换每种文件类型的文件流的方法,但 PDF 答案就在那里。

import boto3
s3 = boto3.resource('s3')
obj = s3.Object(bucket_name, itemname)
fs = obj.get()['Body'].read()

【讨论】: