Я пытаюсь получить размер файла всех файлов в данном сегменте S3. Контейнер S3 передается через аргумент командной строки. Впоследствии скрипт python перебирает каждый объект, найденный в корзине, и получает размер файла для печати на экране. Есть еще что-то, что будет добавлено позже. Но в данный момент я застрял на присвоении переменной значения Key.
До сих пор я пробовал несколько вещей с несколькими ошибками. Прежде чем перейти к этому, если я использую тот же код, но присваиваю значение Key чему-то жестко закодированному, это работает как талисман. Я пытался преобразовать переменную в строковое значение через str (вещь) и repr (вещь), это произошло из-за получения ошибки, что переменная "вещь" не была прочитана как строка.
Затем я попытался использовать фигурные скобки с переменной, как видно из закомментированной строки Key = "{thing}". Я сделал это с и без кавычек. Без кавычек выдает ошибку, что ключ не является допустимым типом 'str'.
import boto3
import sys
# Connect S3
s3 = boto3.resource('s3')
s3Client = boto3.client("s3")
# List S3 buckets
for bucket in s3.buckets.all():
print(bucket.name)
bucket1 = s3.Bucket(sys.argv[1])
sourceBucket = sys.argv[1]
for thing in bucket1.objects.all():
print(thing.key)
# thing = str(thing)
# newThing = str(thing)
fileSize = s3Client.head_object(
Bucket=sourceBucket,
# Key="{thing}"
# Key=newThing
Key="Monkey_puppet.jpg"
)
print(fileSize['ContentLength'])
Почти каждая ошибка имеет вариацию этого. Строки 357 и 661 в client.py постоянно ссылаются.
Traceback (most recent call last):
File "./testScript.py", line 25, in <module>
Key=newThing,
File "/usr/local/lib/python3.6/site-packages/botocore/client.py", line 357, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/usr/local/lib/python3.6/site-packages/botocore/client.py", line 661, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (404) when calling the HeadObject operation: Not Found
При использовании Key = {thing}
Invalid type for parameter Key, value: {s3.ObjectSummary(bucket_name='my-python-testbucket-1', key='Monkey_puppet.jpg')}, type: <class 'set'>, valid types: <class 'str'>
При использовании Key = '{thing}'
botocore.exceptions.ClientError: An error occurred (404) when calling the HeadObject operation: Not Found
При использовании Key = thing
Invalid type for parameter Key, value: s3.ObjectSummary(bucket_name='my-python-testbucket-1', key='Monkey_puppet.jpg'), type: <class 'boto3.resources.factory.s3.ObjectSummary'>, valid types: <class 'str'>
А затем при преобразовании вещи в строку с помощью thing = str (thing)
botocore.exceptions.ClientError: An error occurred (404) when calling the HeadObject operation: Not Found
На данный момент япросто снимая в темноте о том, как Key = будет использовать переменную вместо жестко заданного значения.