Pythonとboto3を使用してS3バケットに特定のディレクトリが存在するかどうかを確認する方法 質問する

Pythonとboto3を使用してS3バケットに特定のディレクトリが存在するかどうかを確認する方法 質問する

S3 内の特定のディレクトリ内に特定のファイルが存在するかどうかを確認するにはどうすればよいでしょうか? 私は Boto3 を使用して、次のコードを試しました (動作しません):

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket')
key = 'dootdoot.jpg'
objs = list(bucket.objects.filter(Prefix=key))
if len(objs) > 0 and objs[0].key == key:
    print("Exists!")
else:
    print("Doesn't exist")

ベストアンサー1

S3 フォルダーを確認する際には、次の 2 つのシナリオがあります。

シナリオ1

import boto3

def folder_exists_and_not_empty(bucket:str, path:str) -> bool:
    '''
    Folder should exists. 
    Folder should not be empty.
    '''
    s3 = boto3.client('s3')
    if not path.endswith('/'):
        path = path+'/' 
    resp = s3.list_objects(Bucket=bucket, Prefix=path, Delimiter='/',MaxKeys=1)
    return 'Contents' in resp
  • 上記のコードでは を使用していますMaxKeys=1。これはより効率的です。フォルダーに多数のファイルが含まれていても、そのうちの 1 つのコンテンツのみをすぐに返します。
  • Contents応答のチェックを観察する

シナリオ2

import boto3

def folder_exists(bucket:str, path:str) -> bool:
    '''
    Folder should exists. 
    Folder could be empty.
    '''
    s3 = boto3.client('s3')
    path = path.rstrip('/') 
    resp = s3.list_objects(Bucket=bucket, Prefix=path, Delimiter='/',MaxKeys=1)
    return 'CommonPrefixes' in resp
  • パスの最後が削除されることに注意してください/。このプレフィックスは、そのフォルダーのみをチェックし、そのフォルダー内はチェックしません。
  • CommonPrefixes応答をチェックし、Contents

おすすめ記事