python-3.x - 如何使用 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")
解决方案
在检查 S3 文件夹时,有两种情况:
方案 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
. 这样效率更高。即使该文件夹包含大量文件,它也会快速回复其中一个内容。 - 观察它检查
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
推荐阅读
- reactjs - useEffect Hook 示例:导致重新渲染的原因是什么?
- javascript - Knex 操作抛出异常
- php - 使用 PHP 将字符串视为多维数组
- vba - 在 PowerPoint for Mac 中安排 VBA 代码
- maven - SpringBoot 项目,application.yml 中的环境变量始终为空
- angular - 如何在 ngSwitchCase 中使用常量
- tarantool - 如何一次从 tarantool 中选择多个键,例如 SQL 中的 SELECT IN?
- php - 如何在函数中定位特定的 wordpress 菜单(wp_nav_menu)?
- javascript - 如何使用 JavaScript 将访问参数传递给 HTML 页面
- asp.net-core - 在 ASP.NET-Core 2.2 中调整大小和创建图像缩略图