【问题标题】:aws-s3 bucket lists the keys in a hierarchy formataws-s3 存储桶以层次结构格式列出键
【发布时间】:2018-11-10 01:33:27
【问题描述】:

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

为什么它不单独打印文件名?键名是指向文件所在的 s3 存储桶的整个目录结构还是此处缺少其他内容?

【问题讨论】:

  • 我猜你正在使用 boto3,在 boto 中你不能只将文件列为 linux。它将返回所有文件,您可以通过 Delimiter='/' 对其进行限制。我不是 python 专家,我确​​信有一种方法可以只过滤 CSV 文件。
  • 是的,我尝试使用 keyname.rindex('/') 限制键,它会打印出 .csv 文件名。但是,如果我要下载这些,它仍然需要整个目录结构并在本地服务器路径中相应地创建子文件夹。有什么办法可以避免吗?

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


【解决方案1】:

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

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

但是,它确实允许在密钥('文件名')中使用/ 字符。还有各种调用可以将 / 字符视为分隔符,以便列出“子目录”(实际上不存在)。

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

aws s3 mb my-bucket

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

当你去列出存储桶时,它会act 就好像 folder1folder2 存在一样。看起来文件夹也已创建,但事实并非如此。它们只是被提供为类似于传统的分层目录。

然后你可以发出这个命令:

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

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

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

如果您想“避免”它,您将需要操作字符串。这可以在 Python 中很容易地完成,例如:

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

【讨论】:

  • 谢谢。现在我明白了,路径名不是结构,而只是文件名。我尝试通过 key_name.rindex('/') 避免使用 '/',然后列出其余部分。当我去我的本地目录下载这些密钥时,文件夹和.csv文件一起被创建..
  • 如果您使用AWS Command-Line Interface (CLI),它将为您创建目录结构。如果您使用 boto3 下载文件,则您已完成对文件保存位置和文件名的控制。
  • 好的,这就是我要找的答案。我一直在使用 aws cli 下载文件。我应该尝试使用 boto3 方法,它应该可以工作。再次感谢..
猜你喜欢
  • 1970-01-01
  • 2010-11-21
  • 2021-01-19
  • 1970-01-01
  • 2015-10-23
  • 2017-06-26
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多