使用boto3检查s3中的bucket中是否存在目录或子目录



我有一个类似s3://my-bucket/data/2020/03/23/01/data.csv的s3结构我想检查s3://my-bucket/data/2020/03/23是否存在。

我可以检查CSV文件是否存在,但我不能使用它,因为文件名可能会更改,所以我想检查文件夹是否存在。

根据您的期望,这可能是不可能的。

首先,值得一提的是文件夹实际上并不存在于AmazonS3中。

例如,您可以运行此命令将文件复制到S3:

aws s3 cp foo.txt s3://my-bucket/data/2020/03/23/

这将把文件放在data/2020/03/23/路径中,这四个目录将"出现"在控制台中,但它们实际上并不存在。相反,对象的键(文件名(包含完整路径

如果您要删除对象:

aws s3 rm s3://my-bucket/data/2020/03/23/foo.txt

那么这四个目录就会"消失"(因为它们根本不存在(。

可以通过在S3管理控制台中单击"创建文件夹"来欺骗。这将创建一个具有文件夹名称的零长度对象(实际上,具有完整路径的名称(。这会导致目录出现在bucket列表中,但这纯粹是因为该路径中存在对象。

在S3中,目录被称为CommonPrefixes,可以使用引用前缀的命令,而不是引用目录。

因此,您可以列出bucket,并提供路径作为前缀。然后,这将返回该路径中的任何对象的列表。

然而,最好的答案是:只要假装它存在,一切都会好起来的

我要做的是John Rotenstein在评论中提到的:列出指定前缀的bucket的内容,在本例中,前缀是您感兴趣的目录(data/2020/03/23/01(的路径。

import boto3
from botocore.exceptions import ClientError
def folder_exists(bucket_name, path_to_folder):
try:
s3 = boto3.client('s3')
res = s3.list_objects_v2(
Bucket=bucket_name,
Prefix=path_to_folder
)
return 'Contents' in res
except ClientError as e:
# Logic to handle errors.
raise e

到目前为止,如果找不到前缀(docs(,list_objects_v2的响应字典将没有'Contents'密钥。

最新更新