我试图从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存储桶的整个目录结构,其中存在文件或其他地方缺少其他内容?
答案 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])