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