Использование переменной для значения ключа при использовании head_object - Amazon S3 Boto3 - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь получить размер файла всех файлов в данном сегменте 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 = будет использовать переменную вместо жестко заданного значения.

1 Ответ

1 голос
/ 08 октября 2019

Вам необходимо передать «ключ» клиентскому объекту S3:

for thing in bucket1.objects.all():
    print(thing.key)
    fileSize = s3Client.head_object(
      Bucket=sourceBucket,
      Key=thing.key
    )
    print(fileSize['ContentLength'])

Хотя на самом деле вам не нужно возглавлять объект, чтобы получить его размер. Различные API-интерфейсы S3, которые перечисляют файлы, возвращают размер в некоторой форме:

for thing in bucket1.objects.all():
    print(thing.key)
    print(thing.size)

Мало того, что это быстрее, это также означает гораздо меньшее количество вызовов API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...