AWS S3 проверяет, существует ли файл на основе условного пути - PullRequest
1 голос
/ 29 мая 2019

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

import boto3
s3 = boto3.resource('s3')
def file_exists(fileN):
    try:
        s3.Object('my-bucket', 'folder1/folder2/'+fileN).load()
    except:
        return False
    else:
        fileN = fileN.split(".")[0]
        try:

            s3.Object('my-bucket', 'folder1/<randomid folderxxxx>/'+fileN+'_condition.jpg').load()
        except:
            return False
        else:
            return True

file_exists("test.jpg")

Это работает, но пока я могу отправить randomfolderID в качестве аргумента. Есть ли лучший и элегантный способ сделать это?

В основном я должен проверить, если

my-bucket/folder1/folder2/test.jpg если это существует, проверьте my-bucket/folder1/<randomID>/test_condition.jpg, если это также существует, вернуть True

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Невозможно указать ключ объекта с помощью подстановочного знака.

Вместо этого вам нужно будет составить список сегментов (который может быть как для всего сегмента, так и внутрипуть), а затем выполните свою собственную логику для идентификации интересующего файла.

Если число объектов небольшое (например, несколько тысяч), список можно легко найти и сохранить в памяти для быстрого сравнения вСписок Python.

Если существуют миллионы объектов, вы можете рассмотреть возможность использования Amazon S3 Inventory , которая может предоставить ежедневный CSV-файл со списком всех объектов в корзине.Использование такого файла будет быстрее, чем сканирование самого блока.

0 голосов
/ 30 мая 2019

Я закончил тем, что использовал немного более чистый код

import boto3
s3client = boto3.client('s3')

def all_file_exist(bucket, prefix, fileN):
    fileFound = False
    fileConditionFound = False
    theObjs = s3client.list_objects_v2(Bucket=bucket, Prefix=prefix)
    for object in theObjs['Contents']:
        if object['Key'].endswith(fileN+'_condition.jpg') :
            fileConditionFound = True
        if object['Key'].endswith(fileN+".jpg") :
            fileFound = True
    if (fileFound and fileConditionFound) : 
        return True
    return False

all_file_exist("bucket","folder1", "test")

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