Я использую приведенный ниже скрипт для загрузки всей корзины S3 (используя ответ из https://stackoverflow.com/users/9806031/konstantinos-katsantonis в Загрузите папку из S3 с помощью Boto3).
Каждый объект в корзине представляет собой csv-файл, содержащий идентичную структуру: 4 поля. 1 временная метка, 2 строки, 1 число с плавающей запятой. Всегда в таком порядке.
import boto3
import botocore
import os
s3 = boto3.resource("s3",
region_name='us-east-2',
aws_access_key_id = '',
aws_secret_access_key = ''
)
bucket_name = '',
s3_folder = '',
local_dir = r''
def download_s3_folder(bucket_name, s3_folder, local_dir):
bucket = s3.Bucket(bucket_name)
for obj in bucket.objects.filter(Prefix=s3_folder):
target = obj.key if local_dir is None \
else os.path.join(local_dir, os.path.relpath(obj.key, s3_folder))
if not os.path.exists(os.path.dirname(target)):
os.makedirs(os.path.dirname(target))
if obj.key[-1] == '/':
continue
bucket.download_file(obj.key, target)
download_s3_folder(bucket_name, s3_folder, local_dir)
Когда я запускаю скрипт, я получаю следующую ошибку. Я подозреваю, что это результат наличия поплавка.
TypeError: expected string or bytes-like object
Что было бы лучшим способом обойти это?
О каких «столбах» вы говорите? Какая строка выдает ошибку? Пожалуйста, отредактируйте свой вопрос, чтобы сообщить нам больше о том, что вы делаете и с какой проблемой вы столкнулись, чтобы мы могли попытаться воспроизвести ситуацию самостоятельно.
Спасибо @JohnRotenstein. Я внес некоторые изменения, которые, надеюсь, прояснили некоторые вещи.
Эти строки:
bucket_name = '',
s3_folder = '',
должно быть:
bucket_name = ''
s3_folder = ''
Запятая в конце строки приводила к тому, что строка становилась кортежем, что недопустимо в качестве имени корзины.
Примечание: для повышения безопасности рекомендуется никогда не помещать ключ доступа и секретный ключ в файлы кода. Вместо этого используйте команду AWS CLI
aws configure
, чтобы сохранить учетные данные в файле конфигурации. boto3 автоматически использует учетные данные из этого файла.