python - 根据关键字选择多个 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)
解决方案
@迈克尔
阅读 boto 文档:
https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-uploading-files.html
上传文件,将本地文件上传到s3。您没有本地文件。您可以在本地创建它并将其上传或从文件从一个存储桶复制到另一个存储桶。
这在这里解决:
如何使用 python boto3 将 s3 对象从一个存储桶复制到另一个存储桶
此致。
推荐阅读
- java - 使用 xml 中的字段类型将 XML 解析为 java 对象
- scala - 将s3“目录”复制到本地目录
- php - 我无法使用 Laravel 和 Dropzone.js 上传文件
- java - 为什么使用 2 的幂来实现 HashMap?
- excel - 使用类对象将数据文件汇总到字典中
- google-chrome - 如何使用 Chrome Headless 模式延迟捕获 DOM
- python - mypy Error TypeVar with Value Restriction and Union of Unions / Optional Cannot Pass generic container type
- symfony - Symfony 4 抛出 UndefinedMethodException 异常
- sapui5 - SAPUI5 为选择元素添加描述/工具提示
- singleton - 单例中的 Monolog 实现