В boto.s3.key.Key
объекте Boto 2 использовался exists
метод, который проверял, существует ли ключ на S3, выполняя запрос HEAD и просматривая результат, но кажется, что его больше не существует. Вы должны сделать это самостоятельно:
import boto3
import botocore
s3 = boto3.resource('s3')
try:
s3.Object('my-bucket', 'dootdoot.jpg').load()
except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == "404":
# The object does not exist.
...
else:
# Something else has gone wrong.
raise
else:
# The object does exist.
...
load()
выполняет запрос HEAD для одного ключа, что быстро, даже если рассматриваемый объект большой или у вас много объектов в корзине.
Конечно, вы можете проверять, существует ли объект, потому что вы планируете его использовать. Если это так, вы можете просто забыть о load()
и сделать a get()
или download_file()
напрямую, а затем обработать ошибку там.
boto3
, кажется, лучшее, что вы можете сделать в данный момент, это позвонить,head_object
чтобы попытаться получить метаданные для ключа, а затем обработать полученную ошибку, если она не существует.exists
логическое значение исчезло, и стало понятнее (я надеюсь!), Что люди должны адаптировать это к своей ситуации.e.response['Error']['Code']
что значение равно"NoSuchKey"
, а не"404"
. С момента написания этого ответа я не проверял, связано ли это с разницей в версиях библиотеки или с изменением самого API. В любом случае, в моей версии boto3 более короткий подход, чем проверка,e.response['Error']['Code']
заключается в том, чтобы ловить толькоs3.meta.client.exceptions.NoSuchKey
в первую очередь.client
(в отличие от aresource
), тоs3.head_object(Bucket='my_bucket', Key='my_key')
вместоs3.Object(...).load()
Я не большой поклонник использования исключений для потока управления. Это альтернативный подход, который работает в boto3:
источник
Самый простой способ, который я нашел (и, вероятно, самый эффективный), заключается в следующем:
источник
s3 = boto3.client('s3')
if e.response['ResponseMetadata']['HTTPStatusCode'] == 404:
В Boto3, если вы проверяете папку (префикс) или файл, используя list_objects. Вы можете использовать существование 'Contents' в ответе dict как проверку того, существует ли объект. Это еще один способ избежать попыток за исключением попыток, как предполагает @EvilPuppetMaster.
источник
s3:GetObject
разрешения, толькоs3:ListBucket
разрешенияНе только
client
ноbucket
иисточник
bucket.Object(key).last_modified
.Вы можете использовать S3F , которые по сути являются оболочкой для boto3, которая предоставляет типичные операции в стиле файловой системы:
источник
источник
FWIW, вот очень простые функции, которые я использую
источник
Предполагая, что вы просто хотите проверить, существует ли ключ (вместо того, чтобы просто перезаписать его), сначала выполните эту проверку:
источник
Это может проверить и префикс, и ключ, и выбрать не более 1 ключа.
источник
Попробуйте это просто
источник
Если у вас в каталоге или корзине меньше 1000, вы можете получить их и после проверки, если такой ключ в этом наборе:
Такой код работает, даже если
my/dir
его не существует.http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.list_objects_v2
источник
источник
Для boto3 ObjectSummary может использоваться, чтобы проверить, существует ли объект.
В ObjectSummary.load
Это показывает, что вы можете использовать
ObjectSummary
вместо,Object
если вы планируете не использоватьget()
.load()
Функция не извлекает объект он только получает резюме.источник
Вот решение, которое работает для меня. Одно предостережение в том, что я заранее знаю точный формат ключа, поэтому я перечисляю только один файл
источник
Вы можете использовать Boto3 для этого.
Здесь ключ - путь, который вы хотите проверить, существует или нет
источник
%timeit
теста это кажется самым быстрым вариантомЭто действительно просто с
get()
методомисточник
Есть один простой способ, с помощью которого мы можем проверить, существует ли файл в корзине S3. Нам не нужно использовать исключение для этого
источник
object_name
существует файл, который начинается с . Например, выmy_file.txt.oldversion
получите ложное срабатывание, если вы проверитеmy_file.txt
. Для большинства это немного крайний случай, но для такого широкого, как «существует ли файл», который вы, вероятно, будете использовать в своем приложении, вероятно, стоит принять во внимание.Если вы ищете ключ, который эквивалентен каталогу, то вам может понадобиться такой подход
Это работает для родительского ключа или ключа, который соответствует файлу, или ключа, который не существует. Я попробовал предпочтительный подход выше и потерпел неудачу на родительских ключах.
источник
Я заметил, что для того,
botocore.exceptions.ClientError
чтобы перехватить исключение, нам нужно установить botocore. botocore занимает 36M дискового пространства. Это особенно важно, если мы используем лямбда-функции aws. Вместо этого, если мы просто используем исключение, мы можем пропустить дополнительную библиотеку!Код выглядит так. Пожалуйста, поделитесь своими мыслями:
источник
Просто следуя за потоком, кто-то может прийти к выводу, какой из них является наиболее эффективным способом проверить, существует ли объект в S3?
Я думаю, что head_object может победить, поскольку он просто проверяет метаданные, которые легче, чем сам объект
источник
С https://www.peterbe.com/plog/fastest-way-to-find-out-if-a-file-exists-in-s3 это самый быстрый метод:
источник
Проверять, выписываться
из Boto S3 Docs
Вы можете просто вызвать bucket.get_key (keyname) и проверить, возвращен ли объект None.
источник