首页 > 解决方案 > 根据关键字选择多个 PDF 并使用 Python boto3 将它们上传到 S3 存储桶中

问题描述

问题描述:我在名为“cases”的 S3 Bucket 中有 PDF 文件。我需要遍历所有这些 PDF,阅读每个 PDF,然后根据关键字选择 PDF。包含指定关键字的 PDF 需要存储在“confirmed-covid19”存储桶中。那些没有指定关键字的 PDF 将存储在“no-covid”存储桶中。

错误:“ValueError:文件名必须是字符串。”

叙述:我分块运行代码以识别错误。下面显示的代码在第 37 行上方运行。错误与第 37 行下方编写的代码有关。我的理解是函数 'upload_file' 只接受文件名和密钥参数的字符串。如何解决此问题,并将选定的包含关键字的 PDF 放入“confirmed-covid19”存储桶中?其余的都在“no-covid”桶中?我仍然想保留每个 PDF 文件的原始名称。完成此任务的最有效方法是什么?此外,欢迎所有改进代码的建议。

import PyPDF2
import re
import os
import textract
import boto3
import glob
from PyPDF2 import PdfFileReader
from io import BytesIO

# Call boto3 to access AWS S3:
s3 = boto3.resource(
     service_name='s3',
     region_name='us-east-1',
     aws_access_key_id='MY_ACCESS_KEY_ID',
     aws_secret_access_key='MY_SECRET_ACCESS_KEY'
)

# Define S3 Bucket name:
bucket_name = s3.Bucket("cases")

# define keywords
search_words = ['Covid-19','Corona','virus'] # Look for these words in PDFs.

# Clients provide a low-level interface to AWS
s3_client = boto3.client('s3')

for filename in bucket_name.objects.all(): # Object summary iterator.
    body = filename.get()['Body'].read()
    f = PdfFileReader(BytesIO(body))       # Read the content of each file
    
    # Search for keywords
    for i in range(f.numPages):
        page = f.getPage(i)          # get pages from pdf files
        text = page.extractText()    # extract the text from each page
        search_text = text.lower().split()
        
# ------------------------------ Line 37 -------------------------------- #   

        for word in search_words:         # look at each keyword 
            if word in search_text:       # find the keyword(s) in the text
                s3_client.upload_file(filename, 'confirmed-covid19', filename)
            else:
                s3_client.upload_file(filename, 'no-covid', filename)

标签: pythonamazon-web-servicespdfamazon-s3boto3

解决方案


@迈克尔

阅读 boto 文档:

https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-uploading-files.html

上传文件,将本地文件上传到s3。您没有本地文件。您可以在本地创建它并将其上传或从文件从一个存储桶复制到另一个存储桶。

这在这里解决:

如何使用 python boto3 将 s3 对象从一个存储桶复制到另一个存储桶

此致。


推荐阅读