New Python Script
import boto3
import logging
import os
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# AWS credentials
aws_access_key_id = ''
aws_secret_access_key = 'R/'
bucket_name = 'bucket'
local_directory = r"path"
# Create a session using the specified credentials
session = boto3.Session(
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
)
s3 = session.client('s3')
# Ensure local directory exists
os.makedirs(local_directory, exist_ok=True)
def list_all_objects_in_folder(bucket, prefix):
paginator = s3.get_paginator('list_objects_v2')
for result in paginator.paginate(Bucket=bucket, Prefix=prefix):
for content in result.get('Contents', []):
yield content['Key']
def download_pdf_files_from_s3(pdf_filenames):
for pdf_filename in pdf_filenames:
logging.info(f"Searching for {pdf_filename}")
found = False
# Iterate through each folder in the bucket
paginator = s3.get_paginator('list_objects_v2')
for result in paginator.paginate(Bucket=bucket_name, Delimiter='/'):
for prefix in result.get('CommonPrefixes', []):
try:
# Recursively list all objects in the current folder
for key in list_all_objects_in_folder(bucket_name, prefix['Prefix']):
if key.endswith(pdf_filename):
# Download the PDF file to a local directory
local_file_path = os.path.join(local_directory, pdf_filename)
s3.download_file(bucket_name, key, local_file_path)
logging.info(f"Downloaded {pdf_filename} from {key}")
found = True
break
if found:
break
except Exception as e:
logging.error(f"Error searching for {pdf_filename} in {prefix['Prefix']}: {str(e)}")
if found:
break
if not found:
logging.warning(f"{pdf_filename} not found in any folder")
if __name__ == "__main__":
try:
with open('pdf_list.txt', 'r') as file:
pdf_filenames = file.read().splitlines()
download_pdf_files_from_s3(pdf_filenames)
except Exception as e:
logging.error(f"Error reading pdf_list.txt: {str(e)}")
Leave a Comment