проверьте, существует ли ключ в корзине в s3, используя boto3

Я хотел бы знать, существует ли ключ в boto3. Я могу зациклить содержимое ведра и проверить ключ, если он совпадает.

Но это кажется более длинным и излишним. Официальные документы Boto3 явно указывают, как это сделать.

Может быть, я упускаю очевидное. Может ли кто-нибудь указать мне, как я могу этого добиться.


person Prabhakar Shanmugam    schedule 21.11.2015    source источник


Ответы (21)


Объект 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() и выполнить get() или download_file() напрямую, а затем обработать случай ошибки там.

person Wander Nauta    schedule 21.11.2015
comment
Спасибо за быстрый ответ Wander. Мне просто нужно то же самое для бото3. - person Prabhakar Shanmugam; 21.11.2015
comment
О, я не знаю, как я это пропустил. Прости за это. - person Wander Nauta; 21.11.2015
comment
Для boto3 кажется, что лучшее, что вы можете сделать на данный момент, - это вызвать _ 2_, чтобы попытаться получить метаданные для ключа, а затем обработать возникшую ошибку, если она не существует. - person Wander Nauta; 21.11.2015
comment
Аналогичная функциональность с использованием функции head_object: stackoverflow.com/questions/26871884/ - person markonovak; 21.03.2016
comment
Если кто-то, использующий boto2, наткнется на этот поток, это k = Key(bucket), затем k.key='hello', тогда вы можете использовать k.exists() - person Carson Ip; 23.06.2016
comment
Внутри блока except вы должны использовать raise, а не raise e, чтобы сохранить трассировку стека. - person Tim; 25.07.2016
comment
Я использую boto3, а исключения не загружаются из import botocore. Пришлось делать из botocore.exceptions import ClientError. - person Alec McGail; 18.08.2016
comment
Я использую head_bucket, поскольку в документации Boto3 сказано: head_bucket(**kwargs) This operation is useful to determine if a bucket exists and you have permission to access it. Кроме того, документация Boto3 ссылается на документацию S3, которая имеет почти такое же объяснение и заявляет, что head_bucket возвращает код 200, если объект существует и у вас есть разрешение на доступ к нему. docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketHEAD. html - person Iron Pillow; 09.10.2017
comment
О, указанное выше предложение head_bucket работает только для корзин, а не для объектов. Я снимаю свое предложение. :-) - person Iron Pillow; 09.10.2017
comment
Вам действительно нужно предложение else: в дополнение к try/except? Не могли бы вы просто вернуть True прямо перед строкой, содержащей предложение except? - person Leonid; 31.10.2017
comment
@Leonid Вы, конечно, могли бы, но только если вы обернули это в функцию или метод, который зависит от вас. Я немного изменил пример кода, так что логическое значение exists исчезло, и стало яснее (я надеюсь!), Что люди должны адаптировать это к своей ситуации. - person Wander Nauta; 08.11.2017
comment
-1; у меня не работает. В boto3 версии 1.5.26 я вижу, что e.response['Error']['Code'] имеет значение типа "NoSuchKey", а не "404". Я не проверял, связано ли это с разницей в версиях библиотек или с изменением самого API с тех пор, как был написан этот ответ. В любом случае, в моей версии boto3 более короткий подход, чем проверка e.response['Error']['Code'], состоит в том, чтобы сначала поймать только s3.meta.client.exceptions.NoSuchKey. - person Mark Amery; 20.02.2018
comment
если вы используете s3 client (в отличие от resource), сделайте s3.head_object(Bucket='my_bucket', Key='my_key') вместо s3.Object(...).load() - person user2426679; 28.04.2020
comment
Я не знаю, почему они закрыли проблему на github, хотя я вижу, что проблема все еще существует в версии 1.13.24. github.com/boto/boto3/issues/759 - person Jaspreet Jolly; 08.06.2020
comment
Когда вы зависите от исключения, всегда есть недостаток, заключающийся в том, что вы зависите от сторонней библиотеки, чтобы генерировать исключение для вас, конечно, реализация может измениться, и в этом случае ваша логика не сработает. Мне нравится ответ EvilPuppetMaster. - person Vishrant; 18.06.2020
comment
Это может вызвать проблемы, если файл большой. - person CrabbyPete; 15.10.2020

Самый простой способ, который я нашел (и, вероятно, самый эффективный), это:

import boto3
from botocore.errorfactory import ClientError

s3 = boto3.client('s3')
try:
    s3.head_object(Bucket='bucket_name', Key='file_path')
except ClientError:
    # Not found
    pass
person o_c    schedule 14.07.2016
comment
Примечание: вам не нужно передавать aws_access_key_id / aws_secret_access_key и т. Д., Если вы используете роль или у вас есть ключи в вашей конфигурации .aws, вы можете просто сделать s3 = boto3.client('s3') - person Andy Hayden; 21.06.2017
comment
Я думаю, что добавление этого теста дает вам немного больше уверенности в том, что объект действительно не существует, а не какая-то другая ошибка, вызывающая исключение - обратите внимание, что 'e' - это экземпляр исключения ClientError: if e.response['ResponseMetadata']['HTTPStatusCode'] == 404: - person Richard; 10.07.2017
comment
@AndyHayden Сколько стоит каждая попытка с точки зрения затрат? - person loop; 20.12.2017
comment
@Taylor - это запрос на получение, но без передачи данных. - person Andy Hayden; 20.12.2017
comment
ClientError - это уловка для 400, а не только для 404, поэтому он не является надежным. - person mickzer; 07.01.2020
comment
Произошла ошибка (403) при вызове операции HeadObject: Запрещено - person ifti; 26.02.2020
comment
@ifti 403 возникает, если у вас (пользователь / роль iam, используемая для создания клиента s3) нет разрешения на вызов head_object для объекта, или если объект не существует и у вас нет разрешения list_bucket в этом папка. Сначала убедитесь, что у вас есть эти разрешения. - person TheJKFever; 28.02.2020
comment
@mickzer, ты прав. Лучше исключить S3.Client.exceptions.NoSuchKey. - person Neau Adrien; 10.07.2020

Я не большой поклонник использования исключений для потока управления. Это альтернативный подход, который работает в boto3:

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket')
key = 'dootdoot.jpg'
objs = list(bucket.objects.filter(Prefix=key))
if any([w.key == path_s3 for w in objs]):
    print("Exists!")
else:
    print("Doesn't exist")
person EvilPuppetMaster    schedule 02.01.2016
comment
Спасибо за обновление EvilPuppetMaster. К сожалению, когда я проверял последний раз, у меня не было прав доступа к ведру списка. Ваш ответ подходит для моего вопроса, поэтому я проголосовал за вас. Но я уже задолго до этого пометил первый ответ как ответ. Спасибо за вашу помощь. - person Prabhakar Shanmugam; 05.01.2016
comment
Разве это не считается запросом на листинг (в 12,5 раз дороже, чем получить)? Если вы сделаете это для 100 миллионов объектов, это может стать немного дороговато ... У меня такое чувство, что метод перехвата исключений, к сожалению, пока лучший. - person Pierre D; 05.05.2016
comment
Список может быть в 12,5 раз дороже на запрос, но один запрос может также вернуть 100 миллионов объектов, тогда как один get может вернуть только один. Таким образом, в вашем гипотетическом случае было бы дешевле получить все 100 миллионов со списком, а затем сравнить локально, чем делать 100 миллионов отдельных выборок. Не говоря уже о том, что в 1000 раз быстрее, поскольку вам не понадобится обход HTTP для каждого объекта. - person EvilPuppetMaster; 07.05.2016
comment
Он не работает, когда мой файл находится внутри папок в ведре s3 - person user3186866; 31.01.2019
comment
@ user3186866 Это потому, что в S3 фактически нет папок. Все объекты существуют как файлы по заданным им путям. Папки - это инструмент, который помогает нам организовать и понять структуру нашего хранилища, но на самом деле корзины S3 - это всего лишь корзины. - person ibtokin; 16.12.2019
comment
Используйте list_objects_v2 клиента S3 и установите MaxKeys на 1. - person Fang Zhang; 27.02.2020
comment
Я получаю эту ошибку AttributeError: объект 'S3' не имеет атрибута 'Bucket' - person Keval; 13.03.2020
comment
При проверке наличия папки (в мире S3: данный ключ является префиксом некоторых объектов), содержащей множество объектов, вы можете ограничить размер ответа: bucket.objects.filter(Prefix=key).limit(1) для экономии времени - person Benav; 24.07.2020
comment
После повторного запуска с отладкой, похоже, bucket.objects.filter(Prefix=key).limit(1) не ограничивает фактический ответ от S3, а только возвращаемую коллекцию на стороне клиента. Вместо этого вы должны bucket.objects.filter(Prefix=key, MaxKeys=1), как предложил @FangZhang выше - person Benav; 30.07.2020
comment
@EvilPuppetMaster - может быть дешевле получить все 100 миллионов со списком и сравнить локально, но если вы перечисляете каждый по их конкретному ключу, как в вашем примере, вам придется перечислить 100 миллионов раз. для эффективного использования List вам необходимо знать общий префикс или список общих префиксов, который для 100 миллионов элементов становится собственным кошмаром N ^ 2, если вам нужно рассчитать его самостоятельно - person zyd; 27.10.2020
comment
@zyd да, мой ответ на стоимость 100 миллионов поисков был больше о том, что общий подход к листингу дешевле, чем поиск, поскольку он может получить 1000 объектов за раз. Очевидно, вы бы реализовали это иначе, чем в примере, приведенном только для одного объекта. Если бы 100-метровые объекты не составляли значительной части вашего ведра или единственного префикса в вашем ведре, то, возможно, это был бы не лучший подход. Но если бы это было так, я бы предложил другие альтернативы, такие как инвентарь s3 для вашей проблемы. - person EvilPuppetMaster; 24.12.2020
comment
@ibtokin, я не понял, что такое папка, если у меня есть файл в папке key = 'dootdoot.jpg', он не будет найден, поэтому мне нужно вводить значение ключа по-другому? key = 'myfolder / dootdoot.jpg' - person Manza; 17.04.2021

В Boto3, если вы проверяете папку (префикс) или файл с помощью list_objects. Вы можете использовать наличие «Contents» в ответе dict как проверку того, существует ли объект. Это еще один способ избежать уловок try / except, как предлагает @EvilPuppetMaster

import boto3
client = boto3.client('s3')
results = client.list_objects(Bucket='my-bucket', Prefix='dootdoot.jpg')
return 'Contents' in results
person Lucian Thorr    schedule 12.02.2016
comment
Была проблема в этом. list_objects (2000) вернет такие ключи, как 2000-01, 2000-02 - person G. Cheng; 27.03.2017
comment
Это возвращает только до 1000 объектов! boto3.amazonaws.com/ версия 1 / документация / api / latest / reference / - person RoachLord; 17.12.2018
comment
Это наиболее эффективное решение, поскольку оно не требует s3:GetObject разрешений, только s3:ListBucket разрешения. - person Vishrant; 28.06.2020

Вы можете использовать S3Fs, который по сути является оболочкой для boto3, которая предоставляет типичные операции в стиле файловой системы. :

import s3fs
s3 = s3fs.S3FileSystem()
s3.exists('myfile.txt')
person VinceP    schedule 14.05.2019
comment
Хотя я думаю, что это сработает, вопрос заключается в том, как это сделать с помощью boto3; в этом случае целесообразно решить проблему без установки дополнительной библиотеки. - person paulkernfeld; 07.01.2020

Предполагая, что вы просто хотите проверить, существует ли ключ (вместо того, чтобы тихо его перезаписывать), сначала выполните эту проверку:

import boto3

def key_exists(mykey, mybucket):
  s3_client = boto3.client('s3')
  response = s3_client.list_objects_v2(Bucket=mybucket, Prefix=mykey)
  if response:
      for obj in response['Contents']:
          if mykey == obj['Key']:
              return True
  return False

if key_exists('someprefix/myfile-abc123', 'my-bucket-name'):
    print("key exists")
else:
    print("safe to put new bucket object")
    # try:
    #     resp = s3_client.put_object(Body="Your string or file-like object",
    #                                 Bucket=mybucket,Key=mykey)
    # ...check resp success and ClientError exception for errors...
person marvls    schedule 05.02.2020

Не только client, но и bucket тоже:

import boto3
import botocore
bucket = boto3.resource('s3', region_name='eu-west-1').Bucket('my-bucket')

try:
  bucket.Object('my-file').get()
except botocore.exceptions.ClientError as ex:
  if ex.response['Error']['Code'] == 'NoSuchKey':
    print('NoSuchKey')
person Vitaly Zdanevich    schedule 28.06.2017
comment
Возможно, вы не захотите получать объект, но просто посмотрите, есть ли он там. Вы можете использовать метод, который возглавляет объект, как и другие примеры здесь, например bucket.Object(key).last_modified. - person ryanjdillon; 26.02.2019

Это может проверить как префикс, так и ключ, и получить не более 1 ключа.

def prefix_exits(bucket, prefix):
    s3_client = boto3.client('s3')
    res = s3_client.list_objects_v2(Bucket=bucket, Prefix=prefix, MaxKeys=1)
    return 'Contents' in res
person Fang Zhang    schedule 27.02.2020

FWIW, вот очень простые функции, которые я использую

import boto3

def get_resource(config: dict={}):
    """Loads the s3 resource.

    Expects AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY to be in the environment
    or in a config dictionary.
    Looks in the environment first."""

    s3 = boto3.resource('s3',
                        aws_access_key_id=os.environ.get(
                            "AWS_ACCESS_KEY_ID", config.get("AWS_ACCESS_KEY_ID")),
                        aws_secret_access_key=os.environ.get("AWS_SECRET_ACCESS_KEY", config.get("AWS_SECRET_ACCESS_KEY")))
    return s3


def get_bucket(s3, s3_uri: str):
    """Get the bucket from the resource.
    A thin wrapper, use with caution.

    Example usage:

    >> bucket = get_bucket(get_resource(), s3_uri_prod)"""
    return s3.Bucket(s3_uri)


def isfile_s3(bucket, key: str) -> bool:
    """Returns T/F whether the file exists."""
    objs = list(bucket.objects.filter(Prefix=key))
    return len(objs) == 1 and objs[0].key == key


def isdir_s3(bucket, key: str) -> bool:
    """Returns T/F whether the directory exists."""
    objs = list(bucket.objects.filter(Prefix=key))
    return len(objs) > 1
person Andy Reagan    schedule 06.08.2018
comment
это единственный ответ, который я видел, который касался проверки существования «папки» по сравнению с «файлом». это очень важно для подпрограмм, которым необходимо знать, существует ли конкретная папка, а не конкретные файлы в папке. - person dave campbell; 05.12.2018
comment
Хотя это осторожный ответ, он полезен только в том случае, если пользователь понимает, что понятие папки в данном случае вводит в заблуждение. Пустая «папка» может существовать в S3 внутри корзины, и если это так, isdir_s3 вернет False, мне потребовалось несколько минут, чтобы разобраться в этом. Я думал о редактировании ответа, как если бы выражение было изменено на ›0, вы получите результат, которого вы ожидаете - person PyNEwbie; 19.10.2019

Использование objects.filter и проверка результирующего списка - это, безусловно, самый быстрый способ проверить, существует ли файл в корзине S3. .

Используйте эту лаконичную единственную строку, которая делает ее менее навязчивой, когда вам нужно вставить ее в существующий проект, не изменяя большую часть кода.

s3_file_exists = lambda filename: bool(list(bucket.objects.filter(Prefix=filename)))

Вышеупомянутая функция предполагает, что переменная bucket уже была объявлена.

Вы можете расширить лямбду для поддержки дополнительных параметров, например

s3_file_exists = lambda filename, bucket: bool(list(bucket.objects.filter(Prefix=filename)))
person nehem    schedule 06.08.2020
comment
Думаю, это лучший ответ. - person Ramin Melikov; 23.07.2021

Попробуйте это просто

import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket_name') # just Bucket name
file_name = 'A/B/filename.txt'      # full file path
obj = list(bucket.objects.filter(Prefix=file_name))
if len(obj) > 0:
    print("Exists")
else:
    print("Not Exists")
person Alkesh Mahajan    schedule 19.03.2019

вы можете использовать для этого Boto3.

import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket')
objs = list(bucket.objects.filter(Prefix=key))
if(len(objs)>0):
    print("key exists!!")
else:
    print("key doesn't exist!")

Здесь ключ - это путь, который вы хотите проверить, существует или нет

person AshuGG    schedule 23.09.2019
comment
Из простого %timeit теста это кажется самым быстрым вариантом - person Itamar Katz; 23.12.2019

Есть один простой способ проверить, существует ли файл в корзине S3. Нам не нужно использовать исключение для этого

sesssion = boto3.Session(aws_access_key_id, aws_secret_access_key)
s3 = session.client('s3')

object_name = 'filename'
bucket = 'bucketname'
obj_status = s3.list_objects(Bucket = bucket, Prefix = object_name)
if obj_status.get('Contents'):
    print("File exists")
else:
    print("File does not exists")
person Mahesh Mogal    schedule 05.05.2018
comment
Это будет неверно, если в сегменте существует файл, который начинается с object_name. Например. my_file.txt.oldversion вернет ложное срабатывание, если вы проверите my_file.txt. Немного крайний случай для большинства, но для чего-то столь же широкого, как существует файл, который вы, вероятно, будете использовать в своем приложении, вероятно, стоит принять во внимание. - person Andrew Schwartz; 11.09.2019

Если вы ищете ключ, эквивалентный каталогу, вам может понадобиться этот подход

session = boto3.session.Session()
resource = session.resource("s3")
bucket = resource.Bucket('mybucket')

key = 'dir-like-or-file-like-key'
objects = [o for o in bucket.objects.filter(Prefix=key).limit(1)]    
has_key = len(objects) > 0

Это работает для родительского ключа или ключа, который приравнивается к файлу, или ключу, который не существует. Я попробовал предпочтительный подход, описанный выше, и потерпел неудачу с родительскими ключами.

person Peter Kahn    schedule 12.02.2019

Если у вас меньше 1000 в каталоге или ведре, вы можете получить их набор и после проверки, есть ли такой ключ в этом наборе:

files_in_dir = {d['Key'].split('/')[-1] for d in s3_client.list_objects_v2(
Bucket='mybucket',
Prefix='my/dir').get('Contents') or []}

Такой код работает, даже если my/dir не существует.

http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.list_objects_v2

person Vitaly Zdanevich    schedule 14.07.2017

Для boto3 ObjectSummary может быть используется для проверки существования объекта.

Содержит сводку объекта, хранящегося в корзине Amazon S3. Этот объект не содержит полных метаданных объекта или какого-либо его содержимого.

import boto3
from botocore.errorfactory import ClientError
def path_exists(path, bucket_name):
    """Check to see if an object exists on S3"""
    s3 = boto3.resource('s3')
    try:
        s3.ObjectSummary(bucket_name=bucket_name, key=path).load()
    except ClientError as e:
        if e.response['Error']['Code'] == "404":
            return False
        else:
            raise e
    return True

path_exists('path/to/file.html')

В ObjectSummary.load

Вызывает s3.Client.head_object для обновления атрибутов ресурса ObjectSummary.

Это показывает, что вы можете использовать ObjectSummary вместо Object, если вы не планируете использовать get(). Функция load() не извлекает объект, а только получает сводку.

person Veedka    schedule 06.11.2018

Я заметил, что для того, чтобы поймать исключение с помощью botocore.exceptions.ClientError, нам нужно установить ботокор. botocore занимает 36M дискового пространства. Это особенно заметно, если мы используем лямбда-функции aws. Вместо этого, если мы просто используем исключение, мы можем пропустить использование дополнительной библиотеки!

  • Я подтверждаю, что расширение файла должно быть ".csv"
  • Это не вызовет исключения, если ведро не существует!
  • Это не вызовет исключения, если ведро существует, но объект не существует!
  • Это вызывает исключение, если ведро пусто!
  • Это вызывает исключение, если у корзины нет разрешений!

Код выглядит так. Поделитесь своими мыслями:

import boto3
import traceback

def download4mS3(s3bucket, s3Path, localPath):
    s3 = boto3.resource('s3')

    print('Looking for the csv data file ending with .csv in bucket: ' + s3bucket + ' path: ' + s3Path)
    if s3Path.endswith('.csv') and s3Path != '':
        try:
            s3.Bucket(s3bucket).download_file(s3Path, localPath)
        except Exception as e:
            print(e)
            print(traceback.format_exc())
            if e.response['Error']['Code'] == "404":
                print("Downloading the file from: [", s3Path, "] failed")
                exit(12)
            else:
                raise
        print("Downloading the file from: [", s3Path, "] succeeded")
    else:
        print("csv file not found in in : [", s3Path, "]")
        exit(12)
person user 923227    schedule 26.02.2019
comment
AWS сообщает, что среды выполнения python поставляются с предустановленным boto3: docs.aws. amazon.com/lambda/latest/dg/lambda-runtimes.html - person rinat.io; 21.02.2020

Вот решение, которое мне подходит. Одно предостережение: я заранее знаю точный формат ключа, поэтому перечисляю только один файл.

import boto3

# The s3 base class to interact with S3
class S3(object):
  def __init__(self):
    self.s3_client = boto3.client('s3')

  def check_if_object_exists(self, s3_bucket, s3_key):
    response = self.s3_client.list_objects(
      Bucket = s3_bucket,
      Prefix = s3_key
      )
    if 'ETag' in str(response):
      return True
    else:
      return False

if __name__ == '__main__':
  s3  = S3()
  if s3.check_if_object_exists(bucket, key):
    print "Found S3 object."
  else:
    print "No object found."
person Rush S    schedule 09.04.2019

Просто проследив за темой, может ли кто-нибудь сделать вывод, какой из них является наиболее эффективным способом проверить, существует ли объект в S3?

Я думаю, что head_object может выиграть, поскольку он просто проверяет метаданные, которые легче, чем сам объект.

person Sai    schedule 10.01.2020
comment
Да, head_object - это самый быстрый способ - это также то, как s3.Object('my-bucket', 'dootdoot.jpg').load() под капотом проверяет, существует ли объект. Вы можете увидеть это, если посмотрите сообщение об ошибке этого метода, когда он не работает. - person Marco; 18.02.2021

Проверить

bucket.get_key(
    key_name, 
    headers=None, 
    version_id=None, 
    response_headers=None, 
    validate=True
)

Проверьте, существует ли в сегменте конкретный ключ. Этот метод использует запрос HEAD для проверки существования ключа. Возвращает: экземпляр объекта Key или None.

из Документов Boto S3

Вы можете просто вызвать bucket.get_key (keyname) и проверить, является ли возвращенный объект None.

person Alexander Truslow    schedule 02.02.2016
comment
Это не работает с boto3, как того требует OP. - person MarkNS; 16.03.2016
comment
Существует две версии библиотеки AWS boto. Этот ответ не работает с версией, запрошенной в вопросе. - person MarkNS; 06.02.2017
comment
Конечно, это неправильный ответ для OP, но он мне помогает, потому что мне нужно использовать boto v2. Вот почему я снял голос «против». - person haͣrͬukaͣreͤrͬu; 01.08.2018

Это действительно просто с get() методом

import botocore
from boto3.session import Session
session = Session(aws_access_key_id='AWS_ACCESS_KEY',
                aws_secret_access_key='AWS_SECRET_ACCESS_KEY')
s3 = session.resource('s3')
bucket_s3 = s3.Bucket('bucket_name')

def not_exist(file_key):
    try:
        file_details = bucket_s3.Object(file_key).get()
        # print(file_details) # This line prints the file details
        return False
    except botocore.exceptions.ClientError as e:
        if e.response['Error']['Code'] == "NoSuchKey": # or you can check with e.reponse['HTTPStatusCode'] == '404'
            return True
        return False # For any other error it's hard to determine whether it exists or not. so based on the requirement feel free to change it to True/ False / raise Exception

print(not_exist('hello_world.txt')) 
person isambitd    schedule 10.12.2019
comment
Неустойчивый, исключение может быть сгенерировано по многим причинам, например. HTTP 500, и этот код предполагает 404. - person mickzer; 07.01.2020
comment
Но нам нужна информация о том, доступен файл или нет. Если он существует и не может быть доступен, то это эквивалентно отсутствию. Правильно? - person isambitd; 07.01.2020
comment
@mickzer сейчас проверьте изменения. - person isambitd; 10.01.2020
comment
Чтобы ответить на ваш предыдущий комментарий, нет, поведение HTTP 500 может заключаться в повторной попытке, 401/403 для исправления аутентификации и т. Д. Важно проверить фактический код ошибки. - person mickzer; 13.01.2020