aws-s3 bucket以层次结构格式列出密钥

时间:2018-05-31 05:51:04

标签: python amazon-web-services amazon-s3 boto3

我试图从aws上托管的s3存储桶下载密钥。密钥只是一些.csv文件。但是这些文件存储在s3存储桶内的子目录中。当我尝试使用s3_client.list_objects-v2(Bucket_name)方法列出特定文件名时,返回的是键的完整层次结构以及它们在s3存储桶中的文件夹。喜欢, 对于bucket,bucket_1

file_name='my_file.csv'
resp=s2_client_conn.list_objects_v2(Bucket='bucket_1')
for obj in resp['Contents']:
   if file_name in obj['Key']:
        print(obj['Key'])

输出是:

sub_dir_1/sub_dir_2/my_csv_file.csv

为什么它不能单独打印file_name?关键名称是指s3存储桶的整个目录结构,其中存在文件或其他地方缺少其他内容?

1 个答案:

答案 0 :(得分:2)

为什么它不能单独打印file_name?这是因为文件名。

Amazon S3是平面对象存储服务。它支持文件夹/目录。

但是,它确实允许键中的/个字符('文件名')。还有各种调用可以将/字符视为分隔符,以便列出子目录' (那真的不存在)。

例如,您可以使用AWS Command-Line Interface (CLI)

执行此操作
aws s3 mb my-bucket

aws s3 cp foo s3://my-bucket/folder1/folder2/foo

当您列出存储桶时, 它看起来也像是创建了文件夹,但它们并不是。它们只是像传统的分层目录一样提供。

然后您可以发出以下命令:

aws s3 rm s3://my-bucket/folder1/folder2/foo

foo文件将被删除,文件夹也会消失!这是因为它们从未存在过。

因此,您的问题的答案:密钥(文件名)是对象的完整路径,因为路径实际上并不存在。它只是一个名字。

如果您希望避免'它,你需要操纵字符串。这可以在Python中很容易地完成,例如:

print(obj['Key'].rsplit('/', 1)[-1])